一、前言
Tomcat服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP程序的首选。同时它是运行在JVM中的一个进程,包含Web容器,相当于是Web容器和JVM之间的中间件。
二、Tomcat的结构图
Tomcat的顶层结构图:
1、Tomcat中最顶层的容器是Server,代表着整个服务器,一个Server至少包含一个Service,用于具体提供服务。
2、Service主要包含两个部分:Connector和Container。Tomcat的心脏就是这两个组件,这两个组件的应用:Connector用于处理连接相关的事情,并提供Socket与Request和Respone相关的转化;Container用于封装和管理Servlet,以及具体处理Request请求。
PS:Sokcet是应用层与TCP/IP协议通信的中间软件抽象层,是一组接口,把复杂的TCP/IP的协议隐藏在接口后面。
3、一个Tomcat只有一个Server,一个Server可以包含很多个Service,一个Service只有一个Container,但是可以有多个Connectors,因为一个服务可以有多个连接。
4、多个Connector和一个Container就形成了一个Service,有了Service就可以对外提供服务了,但是Service还要一个生存环境,必须要有人能够给她生命,那就非Server莫属了!所有整个Tomcat的生命周期由Server控制。
5、Server处理HTTP请求原理图:
1)用户在浏览器中输入该网址,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;
2)Connector把该请求交给它所在的Service的Engine(Container)来处理,并等待Engine的回应;
3)Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;
4)Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“
”的Context去处理);5)path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL Pattern为*.jsp的Servlet,对应于JspServlet类;
6)构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(),执行业务逻辑、数据存储等;
7)Context把执行完之后的HttpServletResponse对象返回给Host;
8)Host把HttpServletResponse对象返回给Engine;
9)Engine把HttpServletResponse对象返回Connector;
10)Connector把HttpServletResponse对象返回给客户Browser。
6、Connector架构分析
Connector用于接收请求并封装成Request和Respone,然后交给Container进行处理,Container处理完之后再交给Connector返回给客户端。
Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter:
1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。
2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。
3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。
7、Container架构分析
Container用于封装和管理Servlet,以及具体处理Request请求,在Connector内部包含了4个子容器,结构图如下:
4个子容器的作用分别是:
(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
(2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封装着一个Servlet;
下面找一个Tomcat的文件目录对照一下,如下图所示:
Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点。
我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.hern.com,如果是Host(webapps)下的其他应用,则可以使用http://www.hern.com/docs进行访问,当然默认指定的根应用(ROOT)是可以进行设定的,只不过Host站点下默认的主营用是ROOT目录下的。
8、Connector和Container的微妙关系
当一个请求发送到Tomcat之后,首先经过Service然后会交给Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!
Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!
三、Tomcat顶层架构小结
(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;
转载于:https://blog.csdn.net/qq_36761831/article/details/89393203