一、序言
Tomcat作为一款Web服务器产品,主要有两个角色,一个是作为一个Http服务器,接收和响应Http请求;另一个则是为一个Servlet容器,存储和处理所有应用的Servlet 实例。分别对应到Tomcat中则是 Coyote组件和Catalina容器。
二、Coyote 组件
当一个请求进来的时候,tomcat 会在连接器组件 Coyote 中解析请求信息,封装成一个ServletRequest 对象,进而交由 Servlet 容易完成处理。整体的流程如下:
根据上图可以看到,Coyote组件是由多个自组件组成:
EndPoint:监听 Socket 请求,实现Socket的接收和发送,是传输层的抽象,实现TCP/IP协议
Processor:用来接收EndPoint传递过来的字节流,将字节流转化成Request,实现Http协议
Adapter:适配器,这里主要是将Request适配成容器可接收的ServletRequest。
另外还有一个ProtocolHandler,主要是包括EndPoint 和Processor,封装了组合多种协议的处理方式。
三、Catalina 容器
Catalina 主要用于存放和处理 Tomcat 相关的一些 Serlvet,所以本质上 Tomcat 也是一个Serlvet 容器。
Tomcat启动的时候就会创建Server 实例,其他实例是通过解析server.xml完成创建。一个Server实例包含多个Service实例,一个Service实例包含多个connector实例和一个Container实例。一个 Connector代表一个连接器,而一个 Container 则是有多个子组件组成。
Container实例包含一个Engine实例,一个Engine实例可以有多个Host,一个Host就代表一个站点,Context则表示一个 Web 应用。一个站点下面可以有多个应用,Context对应就是webapp下的每个项目。而Wrapper则是每个应用下面具体的 Servlet。其实查看 Tomcat 的配置文件Server.xml也可以看到他们的对应关系跟上图是一样的。
所以最终当一个请求进来的时候,Tomcat会通过连接器Coyote组件完成请求路径的解析,进而将请求交给Catalina容器去指定的对应的Servlet容器执行。