tomcat-架构
总体架构
核心功能:
- 处理socket连接,负责将网络字节流与request和response对象的转换
- 加载和管理servlet,以及具体处理request请求
tomcat最顶层是server,一个server有多个service,一个service有多个连接器和一个容器,连接器和容器之间通过ServletRequest和ServletResponse通信
启动流程
- startup.sh:启动jvm运行启动类Bootstrap
- Bootstrap:初始化类加载器,并实例化Catalina
- Catalina:解析server.xml并创建server组件
- Server:启动Service组件
- Service:启动容器和连接器组件
通过组合模式、模板方法、观察者模式和骨架抽象类,tomcat定义了基类LifeCycleBean实现LisfCycle接口,把公共的逻辑,生命周期状态转变和维护、生命事件的触发和监听器的添加删除,子类负责实现自己的init、stop和start等方法
- tomcat自定义了监听器
- @WebListener注解,定义自己的监听器
StandardServer、StandardService等是Server和Service组件的具体实现类,它们都继承了LifecycleBase
StandardEngine、StandarHost、StandardContext和StandardWrapper是相应容器组件的具体实现类,因为它们都是容器,所以继承了ContainerBase抽象基类,而ContainerBase实现了Container接口,也继承了LifecycleBase类,它们的生命周期管理接口和功能接口是分开的
连接器 Connector
连接器进一步细化:
- 监听网络端口
- 接收网络请求
- 读取网络字节流
- 根据应用协议解析字节流,生成统一的tomcat request和tomcat response对象
- 将tomcat request对象转成servletRequest
- 调用servlet容器,得到servletResponse
- 将servletResponse转成tomcat response
- 将tomcat response转成网络字节流
- 将响应字节流回给浏览器
按照高内聚的功能划分:
- 网络通信
- 应用层协议解析
- tomcat request/response与servlet request/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实现了特定协议的解析方法和请求处理方式
Endpoint接收到socket连接后,生成一个socketProcessor交给线程池处理,run方法会调用Processor解析应用层协议,生成tomcat request后,调用adapter的service方法
Adapter
ProtocolHandler接口负责解析请求生成tomcat request、CoyoteAdapter的service方法,将Tomcat Request对象,转成ServletRequest,再调用service方法
容器 Container
容器的层次结构
父子关系的Engine、Host、Context、Wrapper和Servlet
wrapper
表示servletContext
标识web应用程序,context有多个wrapperHost
代表的是一个虚拟注解,或者说一个站点,可以给tomcat配置多个虚拟主机地址,而一个虚拟主机下可以部署多个web应用程序Engine
标识引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine