在介绍Tomcat之前,我们先介绍一个概念Servlet。

Servlet是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议。从下图可以看出Servlet依托于容器运行和提供服务,这类容器称为Servlet容器,Tomcat就是一个Servlet容器。

图中请求在Servlet内完成处理并返回结果,此处可以看出Servlet是服务器端接收外部请求的入口,后端所有的与网页请求有关的业务逻辑均由此引出。

Tomcat调用Servlet的流程如下:

1. Tomcat接收请求,由于可能存在多个客户端同时发起请求,所以Tomcat要能够处理并发请求,那么就需要多线程。

Tomcat 默认配置的最大请求数是150,可以自行设置该参数,操作系统对于进程中的线程数有一定的限制:Windows 每个进程中的线程数不允许超过2000,Linux 每个进程中的线程数不允许超过1000,一般在应用超过250个并发时,建议配置集群服务。

2. Tomcat根据接收的请求,寻找到对应的Servlet。由于所有的资源都存放在Tomcat中,在对项目进行加载时Tomcat内部会建立Servlet对象和类所在地址的映射关系,根据映射关系获取到确定的servlet。

3. Tomcat调用Servlet完成请求----响应的业务实现。Tomcat不能预知客户端会访问哪一个Servlet,所以Tomcat需要动态地调用Servlet对象,底层实现依托Java反射机制,最后调用具体的Servlet执行get或post方法并响应客户端。

结合上述过程,简要介绍下Servlet的生命周期:

用户第一次访问Servlet的时候,服务器Tomcat会创建一个Servlet的实例那么Servlet中init方法就会执行。任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法。在service方法内部根据请求的方式的不同调用doGet或doPost方法。当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行。

最后讨论一个问题,Tomcat接收请求的过程是怎样的?

1. 服务器端监听一个端口,比如8080,然后等待请求。

2. 客户端也就是浏览器由socket套接字发起请求,然后建立连接,此处为建立TCP连接。

3. 客户端就开始向服务器端发送http请求,http请求携带请求数据。

4. 服务器端读到请求数据就开始处理请求,处理完了后给客户端响应数据并回到读请求的状态。

5. 客户端接收到服务器端响应的数据后客户端会展示数据,并回到发送请求的状态。

顺便讨论一个连接的问题,如果上述请求过程结束后,客户端这个http请求并没有回到发送请求的状态,而是直接销毁,下次请求时需重新建立新的连接,这个连接就是短连接,否则就是长连接。http1.0协议是短连接,http1.1开始支持长连接。

引入一个新概念,何为socket套接字?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

Tomcat----服务运行的容器的更多相关文章

  1. 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序

    小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...

  2. 解决一台机器同时运行多个Tomcat服务

    http://www.cnblogs.com/itolssy/archive/2008/09/09/1278041.html 如果不加任何修改,在一台服务器上同时运行两个Tomcat服务显然会发生端口 ...

  3. CVE-2016-1240 Tomcat 服务本地提权漏洞

    catalogue . 漏洞背景 . 影响范围 . 漏洞原理 . 漏洞PoC . 修复方案 1. 漏洞背景 Tomcat是个运行在Apache上的应用服务器,支持运行Servlet/JSP应用程序的容 ...

  4. how tomcat works 五 servlet容器 上

    servlet容器是用来处理请求servlet资源,并为Web客户端填充response对象的模块.在上一篇文章(也就是书的第四章)我们设计了SimpleContainer类,让他实现Containe ...

  5. dubbo服务运行的三种方式

    dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...

  6. Tomcat服务的安装与配置

    介绍 百度百科 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开 ...

  7. 浅谈微服务架构、容器技术与K8S

    关注嘉为科技,获取运维新知 企业应用系统:从单体应用走向微服务架构:从裸金属走向容器. 如果在诸多热门云计算技术诸如容器.微服务.DevOps.OpenStack等之中,找出一个最火的方向,那么可能非 ...

  8. CentOS 7 Tomcat服务的安装与配置

    3422人阅读  http://blog.51cto.com/13525470/2073657 一.Linux下的Java运行环境 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由S ...

  9. 唯品会RPC服务框架与容器化演进--转

    原文地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405781868&idx=1&sn=cbb10d37e25 ...

  10. Tomcat是一个Servlet容器?

    "Tomcat是一个Servlet容器",这句话对于2019年的程序员应该是耳熟能详的. 单纯的思考一下这句话,我们可以抽象出来这么一段代码: class Tomcat { Lis ...

随机推荐

  1. [git]使用Idea创建一个git项目

    第一次使用git的方法,如建立的项目名叫:my-webapp   第一步:在远程gitlab上建立空白项目:my-webapp 第二步:在本地建立项目my-webapp,添加代码 第三步:创建一个本地 ...

  2. SSM批量添加数据

    如何应对面临批量数据时如何提交给后台 方式1: 使用JSON格式 后台功能接受实现使用@ResponseBody 前端当有多行数据的时候添加到一个数组再通过JSON格式到后台List接收 @Reque ...

  3. 一百零五:CMS系统之flask-mail使用和邮箱配置、发送邮件功能

    安装:pip install flask-mail 官方文档:https://pythonhosted.org/Flask-Mail/ 邮箱配置 MAIL_SERVER = 'smtp.qq.com' ...

  4. spring-kafka —— 生产者消费者重要配置

    一.生产者配置 # 以逗号分隔的主机:端口对列表,用于建立与Kafka群集的初始连接 spring.kafka.producer.bootstrap-servers=TopKafka1:9092,To ...

  5. Redis之快速入门与应用[教程/总结]

    内容概要 因为项目中用户注册发送验证码,需要学习redis内存数据库,故而下午花了些时间进行初步学习.本博文性质属于对今日redis学习内容的小结.在看本博文前或者看完后,可以反问自己三个问题:Red ...

  6. Linux学习—yum命令(转载)

    yum简介 yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动 ...

  7. Openstack知识点总结

    Openstack: 一.云计算+openstack概念: 1.云计算是一种按使用量付费的模式,这种模式提供可用的,便捷的,按需的访问,通过互联网进入可配置的计算资源共享池(资源包括网络,计算,存储, ...

  8. python多进程单线程+协程实现高并发

    并发:看起来像同时运行就是并发 并行:同一时间同时被执行叫做并行,最大并行数就是CPU核数 协程不是实实在在存在的物理基础和操作系统运行逻辑,只是程序员从代码层面避开了系统对遇到IO的程序会切走CPU ...

  9. 【LOJ】#3090. 「BJOI2019」勘破神机

    LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...

  10. 「java.util.concurrent并发包」之 CyclicBarrier

    一 描述 CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数.当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续.Cyc ...