前言
本文以Tomcat 8.5.35版本来进行分析。
架构图
由上图可以看出,一个catalina服务器,包含了多个service,而每个service中包含了多个connector和一个container,其中还有一些其他的组件。而connector和container是tomcat容器中最为核心的两个组件。connector用来接受封装请求,container用于具体处理请求后的处理逻辑。
先来看一下container容器中的主要组件:
每一个container中都只含有一个engine(处理引擎),每一个engine里面包含多个host,一个host中可以包含多个context,每个context有包含多个wrapper(封装着一个servlet)。
对于connector来说,请求最终都是交给ProtocolHandler来进行处理,tomcat默认的ProtocolHandler为Http11NioProtocol。其中,EndPoint、Processor、Adapter是ProtocolHandler的核心处理组件。
- EndPoint用于管理socket连接
- Processor 用来处理网络协议的
- Adapter 将请求适配到Servlet容器进行具体的处理
当服务器启动时,一条请求的主要流程如下:
- 进入ProtocolHandler中的EndPoint中的Acceptor接受线程,经过处理注册到Poller线程中(该线程绑定了一个Selector)
- Poller线程调用Handler来处理不同状态的socket。其中Handler会去获取一个Processor去处理解析协议
- Processor将处理后的数据交给Adapter进行适配,从而交给Container做进一步的处理