Tomcat 系统架构

554 阅读3分钟

Tomcat 系统架构

Tomcat 系统总体架构

Tomcat 本质是一个 Web 服务器 + 一个 Servlet 容器

  • Connector(连接器):处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化
  • Container(容器):加载和管理 Servlet,以及处理 Request 请求。

Tomcat 连接器组件 Coyote

Coyote 是 Tomcat 中连接器的组件名称, 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应

  • Coyote 作用

    1. Coyote 封装了底层的网络通信(Socket 请求及响应处理)
    2. Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦
    3. Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处理请求完成后, Catalina 通过Coyote 提供的 Response 对象将结果写⼊输出流
    4. Coyote 负责的是具体协议(应⽤层)和 IO(传输层)相关内容
  • Tomcat Coyote 功能需求

    1. 监听网络端口
    2. 接受网络连接请求
    3. 读取请求网络字节流
    4. 根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的Tomcat Request对象
    5. 将Tomcat Request对象转成标准的 ServletRequest
    6. 调用Servlet容器,得到 ServletResponse
    7. 将 ServletResponse 转成 Tomcat Response 对象
    8. 将 Tomcat Response 对象转成网络字节流
    9. 将响应字节流写回服务器
  • Tomcat Coyote 支持的 IO 模型与协议

Coyote 的内部组件及流程

组件及作用:

  • **EndPoint:**EndPoint 是 Coyote 通信端点,即通信监听的接⼝,是具体 Socket 接收和发送处理器,是对传输层的抽象,因此 EndPoint ⽤来实现 TCP/IP 协议的
  • **Processor:**Processor 是 Coyote 协议处理接⼝ ,如果说EndPoint是⽤来实现TCP/IP协 议的,那么Processor ⽤来实现HTTP协议,Processor 接收来⾃ EndPoint 的 Socket,读取字节流解析成 Tomcat Request 和 Response 对象,并通过 Adapter 将其提交到容器处理,Processor是对应⽤层协议的抽象
  • **ProtocolHandler:**Coyote 协议接⼝, 通过 Endpoint 和 Processor,实现针对具体协议的处理能⼒。Tomcat 按照协议和 I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol
  • **Adapter:**由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat 定义了⾃⼰的 Request 类来封装这些请求信息。ProtocolHandler 接⼝负责解析请求并⽣成 Tomcat Request 类。但是这个 Request 对象不是标准的 ServletRequest,不能⽤ Tomcat Request 作为参数来调⽤容器。Tomcat 设计者的解决⽅案是引⼊ CoyoteAdapter,这是适配器模式的经典运⽤,连接器调⽤ CoyoteAdapter 的 Sevice ⽅法,传⼊的是 Tomcat Request 对象,CoyoteAdapter 负责将 Tomcat Request 转成 ServletRequest,再调⽤容器

Tomcat Servlet 容器 Catalina

Tomcat 本质上就是⼀款 Servlet 容器, 因为 Catalina 才是 Tomcat 的核⼼ , 其 他模块都是为 Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引 擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。

可以认为整个 Tomcat 就是一个 Catalina 实例,Tomcat 启动的时候会初始化这个实例,Catalina 实例通过加载 server.xml 完成其他实例的创建,创建并管理一个 Server,Server 创建并管理多个 Service,每个 Service又可以有多个 Connector 和 一个 Container。

Container 组件的具体结构

  • **Engine:**表示整个 Catalina 的 Servlet 引擎,用来管理多个虚拟站点,一个 Service 最多能有一个 Engine,一个 Engine 可包含多个 Host
  • **Host:**代表一个虚拟主机,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可包含多个 Context
  • **Context:**表示一个 Web 应用程序,一个 Web 应用可包含多个 Wrapper
  • **Wrapper:**表示一个 Servlet,Wrapper 是容器最底层