一、Tomcat 体系结构图
二、各组件作用
1. Coyote 的内部组件
Coyote 组件以及作用 :
组件 | 作用 |
---|---|
EndPoint | EndPoint 是监听的接⼝,是Socket接收和发送处理器,是对传输层的抽象,因此EndPoint⽤来实现TCP/IP协议的 |
Processor | Processor 是Coyote 协议处理接⼝,Processor⽤来实现HTTP协议,Processor接收来⾃EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应⽤层协议的抽象 |
ProtocolHandler | Coyote 协议接⼝, 通过Endpoint 和 Processor , 实现针对具体协议的处理能⼒。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol ,AjpAprProtocol,AjpNio2Protocol ,Http11NioProtocol Http11Nio2Protocol ,Http11AprProtocol |
Adapter | 协议不同,请求信息也不同,Tomcat定义了Request封装信息。将ProtocolHandler 处理成 ServletRequest,这是经典的适配器模式,连接器调用CoyoteAdapter的Sevice⽅法,将Tomcat Request -> ServletRequest |
2. Tomcat Servlet 容器 Catalina
2.1 Tomcat 模块分层结构图及Catalina位置
Tomcat 可以通过 (conf/server.xml)的组件构成的Web容器,⽽Catalina是Tomcat的 servlet容器。Catalina 才是 Tomcat 的核⼼。 其他模块都是为Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。
2.2 Servlet 容器 Catalina 的结构
可认知为整个Tomcat就是一个Catalina实例,Tomcat启动会初始化这个实例,Catalina 实例通过加载server.xml 完成其他实例创建,创建管理一个Server,Server创建多个Serivce,每个Service有多个Connector 和一个Container。
⚠️:多个Connector 对应 一个 Container/Engine
组件 | 作用描述 |
---|---|
Catalina | 解析conf/server.xml,以此创建Server并管理。 |
Server | 表示整个Catalina Servlet容器以及其他组件,负责启动Servlet引擎,Tomcat连接器Connector |
Service | Server内部组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个Container |
Container | 容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块 |
4.3 Container 组件的具体结构
Container组件下有⼏种具体的组件,分别是Engine、Host、Context和Wrapper。这4种组件(容器) 是⽗⼦关系。(都是一对多)Tomcat通过⼀种分层的架构,使得Servlet容器具有很好的灵活性。包含如下组件:
- Engine :表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是可以包含多个Host。
- Host :代表一个虚拟主机,(例如一个www.abc.com域名就是一个虚拟主机),而一个虚拟主机可以包含多个Context。
- Context :代表一个Web应用,⼀个Web应⽤可包含多个Wrapper。
- Wrapper :表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器
上述组件的配置其实就体现在conf/server.xml中。