Tomcat 体系结构
Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来完成 Tomcat 的两大核心功能。
-
连接器,负责对外交流:处理
Socket
连接,负责⽹络字节流与Request
和Response
对象的转化; -
容器,负责内部处理:加载和管理
Servlet
,以及具体处理Request
请求;
连接器组件 Coyote
Coyote 是 Tomcat 中连接器的组件名称 , 是对外的接口。客户端通过 Coyote 与服务器建立连接、发送请求并接受响应 。
-
EndPoint
EndPoint 是 Coyote 通信端点,即通信监听的接⼝,是具体Socket
接收和发送处理器,是对传输层的抽象,因此 EndPoint 用来实现TCP/IP
协议的。 -
Processor
Processor 是 Coyote 协议处理接口,如果说 EndPoint 是⽤来实现TCP/IP
协议的,那么 Processor 用来实现HTTP
协议,Processor 接收来自 EndPoint 的Socket
,读取字节流解析成 TomcatRequest
和Response
对象,并通过 Adapter 将其提交到容器处理,Processor 是对应用层协议的抽象。 -
ProtocolHandler
Coyote 协议接口,通过 Endpoint 和 Processor , 实现针对具体协议的处理能力。Tomcat 按照协议和I/O
提供 6 个实现类:AjpNioProtocol
,AjpAprProtocol
,AjpNio2Protocol
,Http11NioProtocol
,Http11Nio2Protocol
,Http11AprProtocol
。 -
Adapter
由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat 定义了自己的Request
类来封装这些请求信息。ProtocolHandler 接口负责解析请求并生成 TomcatRequest
类。但是这个Request
对象不是标准ServletRequest
,不能用 TomcatRequest
作为参数来调⽤容器。Tomcat 设计者的解决方⽅案是引入 CoyoteAdapter,这是适配器模式的经典运用,连接器调用 CoyoteAdapter 的Sevice
方法,传入的是 TomcatRequest
对象,CoyoteAdapter 负责将 TomcatRequest
转成 ServletRequest,再调用容器。
Tomcat Servlet 容器 Catalina
**Tomcat **就是一个 Catalina 的实例,因为 Catalina 是 Tomcat 的核心。
Tomcat / Catalina 实例
-
Catalina
负责解析 Tomcat 的配置文件(server.xml
) , 以此来创建服务器 Server 组件并进行管理。 -
Server
服务器表示整个 Catalina Servlet 容器以及其它组件,负责组装并启动 Servlet 引擎,Tomcat 连接器。Server 通过实现 Lifecycle 接口,提供了一种优雅的启动和关闭整个系统的方式。 -
Service
服务是 Server 内部的组件,一个 Server 包含多个 Service。它将若干个 Connector 组件绑定到一个 Container。 -
Container
容器,负责处理用户的 servlet 请求,并返回对象给web
用户的模块 Container 组件下有几种具体的组件,分别是 Engine、Host、Context 和 Wrapper。这 4 种组件(容器)是父子关系。Tomcat 通过一种分层的架构,使得Servlet 容器具有很好的灵活性。-
Engine 表示整个 Catalina 的 Servlet 引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine,但是一个引 擎可包含多个 Host。
-
Host 代表一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可包含多个 Context。
-
Context 表示一个
Web
应用程序, 一个Web
应⽤可包含多个 Wrapper。 -
Wrapper 表示一个 Servlet,Wrapper 作为容器中的最底层,不能包含子容器。
上述组件的配置其实就体现在
conf/server.xml
中。 -