Tomcat 系统架构与原理剖析

1. 浏览器访问服务器的流程浏览器访问服务器使用的是 Http协议 , Http协议 是应用层协议,用于定义数据通信的格式,具体的数据传输使用的是 TCP/IP协议  。

Tomcat 系统架构与原理剖析

文章插图
 
2. Tomcat 系统总体架构Tomcat是一个 Http服务器 (能够接受并且处理 http 请求,所以 Tomcat 是一个 Http服务器 ) 。
2.1. Tomcat 处理请求大致流程
Tomcat 系统架构与原理剖析

文章插图
 
HTTP服务器接收到请求之后把请求交给 Servlet容器 来处理, Servlet容器 通过 Servlet接? 调?业务类 。
Servlet接?和 Servlet容器 这?整套内容叫作 Servlet规范  。
Servlet容器有解耦的作用,避免 Http服务器 和 业务类 的直接耦合 。
由于 Tomcat 根据 Servlet规范 实现了 Servlet容器 ,同时它又具有 Http服务器 的功能,所以 Tomcat 拥有两个重要身份:
  • Servlet容器
  • Http服务器
2.2. Tomcat Servlet容器处理流程
Tomcat 系统架构与原理剖析

文章插图
 
【Tomcat 系统架构与原理剖析】当用户请求某个URL资源时:
  • 1) Http服务器 会把请求信息封装成 Request对象 ,再转化成 ServletRequest对象 ,传入 Servlet容器 ;
  • 2) Servlet容器 接收到请求后,根据 URL 和 Servlet 的映射关系(必要的配置信息),找到对应的 Servlet ;
  • 3) 如果 Servlet 还没有被加载,使用 反射技术 创建该 Servlet ,并调用 Servlet 的 init 方法来完成初始化;
  • 4) 调用 Servlet 的 service 方法处理请求,将请求处理结果封装成 ServletResponse 对象,返回给 Http服务器 ;
  • 5) Http服务器 将接收到的 ServletResponse对象 转化成 Response对象 ,返回给客户端 。
2.3. Tomcat 系统总体架构
Tomcat 系统架构与原理剖析

文章插图
 
Tomcat设计了两个核心组件 连接器(Connector) 和 容器(Container) 来完成 Tomcat 的两大核心功能:
  • 连接器:负责对外交流 ,处理Socket连接,负责 网络字节流 和 Request/Response 对象的转化;
  • 容器:负责内部处理 ,加载和管理Servlet,以及具体请求的处理 。
3. Tomcat 连接器组件 Coyote3.1. Coyote简介Coyote是 Tomcat连接器组件 的名称,是对外的接口 。客户端通过 Coyote 与服务端建立连接、发送请求并接受响应 。
Coyote负责的是 具体协议(应用层) 和 IO(传输层) 的相关内容:
  • Coyote 封装了底层的网络通信(Socket请求及响应处理)
  • Coyote 使 Catalina容器(容器组件) 与具体的 请求协议 和 IO操作方式 完全解耦
  • Coyote 将 Socket 输入转化封装为 Request对象 ,进一步交给 Catalina容器 处理,处理完成后, Catalina容器 通过 Coyote 提供的 Response对象 将结果写入输出流

Tomcat 系统架构与原理剖析

文章插图
 
Tomcat (Coyote)支持多种应用层协议和I/O模型:
Tomcat 系统架构与原理剖析

文章插图
 
在 8.0 版本之前, Tomcat 默认采用的 I/O模型 是 BIO,8.0 版本之后,改为 NIO。
3.2. Coyote内部组件及流程
Tomcat 系统架构与原理剖析

文章插图
 
Coyote内部各组件的作用:
组件作用EndPointEndPoint 是 Coyote 的通信端点,即通信监听的接口,是具体 Socket 接收和发送的处理器,是对 传输层的抽象  。因此 EndPoint 用来实现 TCP/IP协议ProcessorProcessor 是 Coyote 的协议处理接口,用来实现 HTTP协议 , Processor 接收来? EndPoint 的 Socket ,读取字节流解析成 Tomcat Request 和 Response对象 ,并通过 Adapter 将其提交到容器处理, Processor 是对应?层协议的抽象ProtocolHandlerCoyote 协议接?,通过 Endpoint 和 Processor ,实现针对具体协议的处理能? 。 Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol , AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol , Http11AprProtocolAdapterCoyoteAdapter 负责将 Tomcat Request 转成 ServletRequest ,再调?容器


推荐阅读