参照《tomcat架构解析》,梳理下tomcat整体结构,其中部分图片来自于这本书。tomcat涉及很多组件,逐步拆解来看

- 一个Executor:线程池用于处理请求
Connector
Connector是负责网络相关的工作,具体就是监听网络端口将网络读取到的数据解析成Request,将Engine处理完的Response通过网络传输给客户端。涉及到的组件有ProtocolHandler、AbstractEndpoint、Processor
Connector本身并不处理网络工作,而是维护ProtocolHandler、Adaptor以及一些配置,具体这些工作是交给ProtocolHandler来处理。Connector本身会
- 根据配置创建ProtocolHandler
- 创建Adaptor。Connector本身也不需要Adaptor,会将创建的Adaptor传给ProtocolHandler
ProtocolHandler具体来处理网络工作,ProtocolHandler将网络工作分成两块
1、网络数据交互。也就是监听网络端口,以及将响应写给客户端。具体由AbstractEndpoint处理
2、数据解析及分发。AbstractEndpoint收到数据后,会由Processor来解析成Request并创建Response。将请求交给CoyoteAdaptor,由CoyoteAdaptor找到serlet容器并调用
CoyoteAdaptor
CoyoteAdaptor负责将请求映射到Servlet并调用到Servlet,映射关系由Mapper维护。CoyoteAdaptor通过Mapper映射到Servlet,然后调用Engine的pipeline。根据pipeline机制,请求会按顺序调用每个pipeline最终调用到Servlet
Mapper
Mapper维护了请求到Servlet的映射关系,MapperListener监听容器事件来更新Mapper
Engine
Engine是Servlet顶层的容器,一个Service维护一个Engine,下面还有Host、Context、Wrapper等容器。
- Host:是对虚拟主机概念的抽象。为什么需要单独抽象出来Host?假如有两个子域名,承接不同服务。正常来讲应该部署为两套系统,但在规模比较小的情况下也可以部署在一台服务器上,通过Host虚拟出来两个主机
- Context:是对应用的抽象,一个Host下可以包含多个应用。应用拥有一套代码,可以通过war、jar包部署。在tomcat里体现就是webapps下面的一个应用
- Wrapper:是对Servlet的抽象,一个Context可以包含多个Wrapper