来源
本文整理自 <Tomcat内核设计剖析>、<Tomcat结构解析>
Tomcat 整体架构
如上图所示:包含了Tomcat内部的主要组件,每个组件之间的层次包含关系很清楚。Tomcat大体上可以看成由 Connector 和 Container 组件组成。Connector组件负责在服务器端处理客户端连接(客户端连接、接收客户端消息报文、消息报文的解析等),Container负责对客户端的请求进行逻辑处理,并把结果返回给客户端。
对应的server.xml中节点
<Server>
<Listener/>
<GlobalNamingResources>
<Resource/>
</GlobalNamingResources>
<Service>
<Executor/>
<Connector/>
<Engine>
<Cluster/>
<Realm/>
<Host>
<Context/>
</Host>
</Engine>
</Service>
</Server>
Tomcat内部组件
Server组件
Server是最顶级的组件,代表Tomcat的运行实例,一个JVM中只会有一个Server。
- Listener组件:在Tomcat生命周期中完成不同的工作。
- GlobalNamingResources组件:集成JNDI
Service组件
是服务的抽象,代表请求从接收到处理的所有的组件的集合。每个Service包含若干个用于接收客户端的Connector组件和处理请求的Engine组件。还包含了若干个Executor组件,每个都是一个线程池。
Connector组件
Connector 主要负责接收客户端连接并接收请求报文、解析报文转交给 Container容器去处理。为了实现不同的通信协议,所以有多个 Connector组件,每种协议对应一个Connector组件,目前有 Http协议、AJP协议两种Connector组件。
在阻塞I/O方式下:Connector的结构如图:
在非阻塞I/O方式下:Connector的结构如图:
-
Protocol组件:是协议的抽象,包含接收客户端连接、接收客户端消息报文、报文解析处理、对客户端的响应等过程,主要包含:
- Endpoint:内部的 Acceptor 会对端口进行监听,有请求会丢到 Executor,然后转交给 Processor组件。
- Processor: Processor组件对协议进行解析并传递到 Engine容器进行处理。
-
Mapper组件:对请求地址进行路由。
-
CoyoteAdaptor组件:一个将Connector 和 Container 联系起来的适配器。
在 BIO和NIO下,使用的组件有所不同,并且NIO多了一个 Poller组件(轮询多个客户端连接,不断检测,处理各种事件。)
Engine组件
Engine 代表全局Servlet引擎,每一个 Service 只能包含一个 Engine容器组件,但是Engine组件 可以包含很多个Host容器组件,还包含如下组件:
- Listener组件:在Tomcat生命周期中完成某些Engine容器相关工作。
- AccessLog组件:客户端的访问日志,所有客户端访问都会被记录。
- Cluster组件:提供集群功能,可将Engine容器需要共享的数据同步到集群中的其他Tomcat实例上。
- Pipeline组件:Engine容器对请求进行处理的管道。
- Realm组件:提供Engine容器级别的用户--密码--权限的数据对象,配合资源认证模块使用。
Host组件
Host组件代表虚拟主机,这些虚拟主机可以存放若干Web应用的抽象(Context容器),还有以下组件:
- Listener组件:在Tomcat生命周期中完成某些Host容器相关工作。
- AccessLog组件:客户端的访问日志,对该虚拟主机上所有WEB应用的访问都会被记录。
- Cluster组件:提供集群功能,可将Host容器需要共享的数据同步到集群中的其他Tomcat实例上。
- Pipeline组件:Host容器对请求进行处理的管道。
- Realm组件:提供Host容器级别的用户--密码--权限的数据对象,配合资源认证模块使用。
Context组件
Context组件是WEB应用的抽象,WEB应用部署到Tomcat后运行会转成Context对象。
- Listener组件:在Tomcat生命周期中完成某些Context容器相关工作。
- AccessLog组件:客户端的访问日志,对该WEB应用的访问都会被记录。
- Pipeline组件:Context容器对请求进行处理的管道。
- Realm组件:提供Context容器级别的用户--密码--权限的数据对象,配合资源认证模块使用。
- Loader组件:WEB应用加载器,用于加载WEB应用的资源,要保证不同WEB应用之间的资源隔离。
- Manager组件:会话管理器,用于管理对应WEB容器的会话,包括维护会话的生成、更新、销毁。
- NamingResource组件:命名资源,负责将Tomcat配置文件的Server.xml和Web应用的context.xml资源和属性映射到内存中。
- Mapper组件:Servlet映射器,属于Context内部的路由映射器,只负责该Context容器的路由。
- Wrapper组件:Context的子容器。
Wrapper组件
一个Wrapper对应一个 Servlet,包含以下组件:
- Servlet组件:
- ServletPool组件:当WEB应用实现了 SingleThreadModel 接口时,会在Wrapper中产生一个Servlet对象池。线程执行,先从对象池中获取一个Servlet对象,能保证线程安全。
- Pipeline组件:Wrapper容器对请求进行处理的管道。