Tomcat 非常的模块化,只要找到最核心的模块,问题游刃而解,了解整体架构对深入了解 Tomcat 至关重要!
本文来源:Java后端技术
1
Tomcat
顶层架构
先上一张 Tomcat 的顶层结构图(图A),如下:
Tomcat 中最顶层的容器是 Server,一个 Server 可以包含至少一个 Service,用于具体提供服务。
Service 包含两个部分:Connector 和 Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:
1、Connector 用于处理连接相关的事情,并提供 Socket与Request 和 Response 相关的转化;
2、Container 用于封装和管理 Servlet,以及具体处理 Request 请求;
一个 Tomcat 中只有一个 Server,但是可以有多个 Connectors,这是因为一个服务可以有多个连接,如同时提供 Http 和 Https 链接,也可以提供向相同协议不同端口的连接,示意图如下(Engine、Host、Context下边会说到):
多个 Connector 和一个 Container 就形成了一个 Service,但是 Service 还要一个生存的环境 Server !所以整个 Tomcat 的生命周期由 Server 控制。另外,上述的包含关系或者说是父子关系,都可以在 tomcat 的 conf 目录下的server.xml
配置文件中看出(Tomcat 版本为8.0)
这张结构图也能更清楚的理解:
Server 标签设置的端口号为 8005,shutdown=”SHUTDOWN” ,表示在8005端口监听“SHUTDOWN”命令,如果接收到了就会关闭 Tomcat。
2
Connector和Container
的微妙关系
一个请求发送到 Tomcat 之后,首先经过 Service 然后会交给Connector,并将请求封装为 Request 和 Response 来具体处理,封装之后再交由 Container 处理,然后再返回给 Connector,最后在由通过Socket 将处理结果返回客户端,请求处理结束!
Connector 最底层使用的是 Socket 来进行连接的,Request 和 Response是按照 HTTP 协议来封装的,所以 Connector 同时需要实现TCP/IP 协议和 HTTP 协议!Tomcat 处理请求,那么肯定需要先接收到这个请求,接收请求这个东西我们首先就需要看一下 Connector!
3
Connector
架构分析
Connector 用于接受请求并将请求封装成 Request 和 Response,然后交给 Container 进行处理,Container 处理完之后在交给 Connector 返回给客户端。
因此,我们可以把 Connector 分为四个方面进行理解:
(1)Connector如何接受请求的?
(2)如何将请求封装成Request和Response的?
(3)封装完之后的Request和Response如何交给Container进行处理的?
(4)Container处理完之后如何交给Connector并返回给客户端的?
首先看一下 Connector 的结构图(图B),如下所示:
Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler 代表不同的连接类型,比如:Http11Protocol 使用的是普通Socket来连接的,Http11NioProtocol 使用的是 NioSocket 来连接的。
4
Container
架构分析
Container 用于封装和管理 Servlet,以及具体处理 Request 请求,在Connector 内部包含了4个子容器,结构图如下(图C):
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 下的则直接使用域名就可以访问。
5
总结
至此,我们已经对 Tomcat 的整体架构有了大致的了解,可以看出来每一个组件的基本要素和作用。如果你能脱口而出的聊一下 Tomcat,就会发现这不只是一种令程序员颤抖的技术,还是令面试官刮目相看的技术。