tomcat架构
tomcat最顶层是server,一个server有多个service,一个service有多个连接器和一个容器,连接器和容器通过ServletRequest和ServletResponse通信
- Server:指的就是整个tomcat服务器,包含多组服务,负责管理和启动service,同时监听8005端口发过来的shutdown命令,用于关闭整个容器
- Service:tomcat封装的对外提供完整的、基于组件的web服务,包含Connectors、Container两个核心组件。以及多个功能组件,各个Service之间是独立的,但是共享同一jvm资源
- Connector:tomcat与外部世界的连接器,监听固定端口接收外部请求,传递给container,并将container处理的结果返回给外部
- Container:servlet容器,内部有多层容器组成,用于管理servlet生命周期,调用servlet相关方法
启动流程
- startup.sh:启动jvm运行启动类Bootshrap
- Bootshrap:初始化类加载器,并实例化Catalina
- Catalina:解析server.xml并创建server组件
- Server:启动Service组件
- Service:启动容器和连接器组件
连接器Connector
作用
- 监听网络端口
- 接受网络请求
- 读取网络字节流
- 根据应用协议解析字节流,生成统一的tomcat request和tomcat response对象
- 将tomcat request对象转换成servletRequest
- 调用servlet容器,得到servletResponse
- 将servletResponse转换成tomcat response
- 将tomcat response转换成网络字节
- 将字节流回写给浏览器
执行流程
- Endpoint:负责提供字节流给Processor
- Processor:负责提供tomcat request对象给Adapter
- Adapter:提供ServletRequest给容器
注:Endpoint和Processor抽象组合在一起形成了ProtocolHandler组件
ProtocolHandler
Endpoint
- 接口,抽象实现类是AbstractEndpoint,具体子类在NioEndpoint和Nio2Endpoint,其中两个重要组件:Acceptor和SocketProcessor
- Acceptor用于监听Socket连接请求,SocketProcessor用于处理收到的Socket请求,提交到线程池Executor处理
Processor
- 接受Endpoint的socket,读取字节流解析成tomcat request和response,通过adapter将其提交到容器处理。Processor的具体实现类AjpProcessor、Http11Processor实现了特定协议的解析方法和请求处理方法
Adapter
- ProtocolHandler接口负责解析请求生成tomcat request,CoyoteAdapter的service方法,将tomcat request转成ServletRequest,再调用service方法
容器Container
层级结构
- Engine:servlet的顶层容器,包含一个或多个host子容器
- Host:虚拟主机,负责web应用的部署和context的创建
- Context:web应用上下文,包含多个wrapper,负责web配置的解析,管理所有的web资源
- Wrapper:最底层的容器,是对servlet的封装,负责servlet实例的创建,执行和销毁