tomcat-架构

tomcat-架构

起男 1,278 2021-02-02

tomcat-架构

总体架构

核心功能:

  • 处理socket连接,负责将网络字节流与request和response对象的转换
  • 加载和管理servlet,以及具体处理request请求

tomcat最顶层是server,一个server有多个service,一个service有多个连接器和一个容器,连接器和容器之间通过ServletRequest和ServletResponse通信

启动流程

  1. startup.sh:启动jvm运行启动类Bootstrap
  2. Bootstrap:初始化类加载器,并实例化Catalina
  3. Catalina:解析server.xml并创建server组件
  4. Server:启动Service组件
  5. 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表示servlet
  • Context标识web应用程序,context有多个wrapper
  • Host代表的是一个虚拟注解,或者说一个站点,可以给tomcat配置多个虚拟主机地址,而一个虚拟主机下可以部署多个web应用程序
  • Engine标识引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine

原文:https://mp.weixin.qq.com/s/U49ZIWYRvIYYFkL-06aSXA