1. 浏览器访问服务器的流程

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

03147008203582014d67695008e9f5b6.png

2. Tomcat 系统总体架构

Tomcat是一个 Http服务器 (能够接受并且处理 http 请求,所以 Tomcat 是一个 Http服务器 )。

2.1. Tomcat 处理请求大致流程

67b8cde3478f75876da8ae80615a9182.png

HTTP服务器接收到请求之后把请求交给 Servlet容器 来处理, Servlet容器 通过 Servlet接⼝ 调⽤业务类。

Servlet接⼝和 Servlet容器 这⼀整套内容叫作 Servlet规范

Servlet容器有解耦的作用,避免 Http服务器业务类 的直接耦合。

由于 Tomcat 根据 Servlet规范 实现了 Servlet容器 ,同时它又具有 Http服务器 的功能,所以 Tomcat 拥有两个重要身份:

  • Servlet容器
  • Http服务器

2.2. Tomcat Servlet容器处理流程

b97bedadd6e506558d1039b5fc758c3a.png

当用户请求某个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 系统总体架构

77da355a84cd3f49deebacdfc014b17f.png

Tomcat设计了两个核心组件 连接器(Connector)容器(Container) 来完成 Tomcat 的两大核心功能:

  • 连接器:负责对外交流 ,处理Socket连接,负责 网络字节流Request/Response 对象的转化;
  • 容器:负责内部处理 ,加载和管理Servlet,以及具体请求的处理。

3. Tomcat 连接器组件 Coyote

3.1. Coyote简介

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

Coyote负责的是 具体协议(应用层)IO(传输层) 的相关内容:

  • Coyote 封装了底层的网络通信(Socket请求及响应处理)
  • Coyote 使 Catalina容器(容器组件) 与具体的 请求协议IO操作方式 完全解耦
  • CoyoteSocket 输入转化封装为 Request对象 ,进一步交给 Catalina容器 处理,处理完成后, Catalina容器 通过 Coyote 提供的 Response对象 将结果写入输出流
a33a6f77960cd9017e7e708b4455e319.png

Tomcat (Coyote)支持多种应用层协议和I/O模型:

42c3ac71790111cfe21297e2b6428b81.png

在 8.0 版本之前, Tomcat 默认采用的 I/O模型 是 BIO , 8.0 版本之后,改为 NIO 。

3.2. Coyote内部组件及流程

6bd31419eeb47d62a7a7559069bc5627.png

Coyote内部各组件的作用:

组件作用EndPointEndPointCoyote 的通信端点,即通信监听的接口,是具体 Socket 接收和发送的处理器,是对 传输层的抽象 。因此 EndPoint 用来实现 TCP/IP协议ProcessorProcessorCoyote 的协议处理接口,用来实现 HTTP协议Processor 接收来⾃ EndPointSocket ,读取字节流解析成 Tomcat RequestResponse对象 ,并通过 Adapter 将其提交到容器处理, Processor 是对应⽤层协议的抽象ProtocolHandlerCoyote 协议接⼝,通过 EndpointProcessor , 实现针对具体协议的处理能⼒。 Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocolAjpAprProtocolAjpNio2ProtocolHttp11NioProtocolHttp11Nio2ProtocolHttp11AprProtocolAdapterCoyoteAdapter 负责将 Tomcat Request 转成 ServletRequest ,再调⽤容器

4. Tomcat Servlet 容器 Catalina

4.1. Tomcat模块分层结构图和Catalina的地位

Tomcat是由一系列可配置(conf/server.xml)的组件构成的 Web容器 ,而 CatalinaTomcatServlet容器

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

71830a14df87071cf25381ebf5e5116e.png

4.2. Servlet 容器 Catalina 的结构

我们往往有⼀个认识, Tomcat 就是⼀个 Catalina 的实例,因为 CatalinaTomcat 的核⼼。

Tomcat/Catalina实例:

e7cf6dd3e96307a029a760ae44c71e0e.png

其实,可以认为整个 Tomcat 就是⼀个 Catalina实例Tomcat 启动的时候会初始化这个实例, Catalina实例 通过加 server.xml 完成其他实例的创建,创建并管理⼀个 ServerServer 创建并管理多个 服务(Service) ,每个 服务(Service) ⼜可以有多个 Connector 和⼀个 Container

  • Catalina负责解析Tomcat的配置文件(server.xml),以此来创建Server组件并进行管理
  • Server负责组装并启动Servlaet引擎,Tomcat连接器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式
  • Service服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个Container
  • Container容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块

4.3. Container组件的具体结构

Container组件下有⼏种具体的组件,分别是 EngineHostContextWrapper 。这4种组件(容器)是⽗⼦关系。 Tomcat 通过⼀种分层的架构,使得 Servlet 容器具有很好的灵活性。

  • Engine表示整个Catalina的Servlet引擎,⽤来管理多个虚拟站点,⼀个Service最多只能有⼀个Engine,但是⼀个引擎可包含多个Host
  • Host代表⼀个虚拟主机,或者说⼀个站点,可以给Tomcat配置多个虚拟主机地址,⽽⼀个虚拟主机下可包含多个Context
  • Context表示⼀个Web应⽤程序, ⼀个Web应⽤可包含多个Wrapper
  • Wrapper表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器
Logo

开源、云原生的融合云平台

更多推荐