引言
本篇为Tomcat
源码学习的开篇,主要通过阅读Tomcat的源码来了解其真正的运行流程以及原理,同时学习其中的架构设计等等。本文主要说明Tomcat
的架构。
Tomcat
架构- 一次
HTTP
请求在tomcat
中的流程 - 总结
一、Tomcat架构
Tomcat
中的架构还是有点复杂的,但是好在Tomcat
属于高度模块化的容器,如果可以搞明白其中的核心模块的原理,抓住重点就可以对Tomcat
的架构有更加深刻的理解。Tomcat
的架构如下图所示:
由上图可知,Tomcat
容器中的Server
是其顶级接口,它管理着多个Service
服务,而Service
服务又管理着多个Connector
以及一个Container
,其中核心组件为Connector
以及Container
。
Server
组件
所谓Server
组件就是Tomcat
的运行实例,一个JVM只包含一个Server
组件。
Service
组件
Service
组件是将Connector
组件与Container
组件包装组合在一起,对外提供服务。该组件中会包含多个Connector
组件组件以及一个Container
组件。
Connector
组件
该组件主要负责监听指定端口的客户端请求(不同端口对应不同的Connector
组件),将Socket请求过来的数据,都封装成Request请求对象,同时将该请求对象传递给容器进行下一步的处理。
Container
组件
Container
组件包含了四个子容器,分别为Engine
、Host
、Context
、Wrapper
,其内部大致结构如下图所示:
Engine
:引擎,用来管理多个站点, 一个Service
最多只能有一个Engine
;
Host
:代表一个站点,也可以叫虚拟主机,通过配置Host 就可以添加站点;
Context
:代表一个应用程序,即为我们开发的一个war
服务在webapp
目录下的各个应用,或者一个WEB-INF
目录以及下面的web.xml
文件;
Wrapper
:每个Wrapper
封装着一个servlet
。
二、一次HTTP
请求在tomcat
中的流程
图片来自于网络
由上图可知。当一个HTTP
请求到达Tomcat
后,所经历的大致流程如下:
1、在用户在浏览器中点击页面进行数据请求后,Tomcat
本机默认端口8080
接收到数据请求,被在那里监听的Coyote HTTP/1.1 Connector
获得;
2、Connector
把封装好的Request
请求交由其所在的Service的Engine
来处理,并等待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
响应对象返回给客户端的浏览器。
三、总结
本文主要讲解了Tomcat
系统架构,同时介绍了其中涉及的重要组件。第二节主要叙述了HTTP
请求在Tomcat
中的流转过程。在下篇文章中,我们将从源码的角度出发来一探Tomcat
的运行原理。