Tomcat原理剖析-Tomcat整体架构设计

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情


1.写在前面

在昨天我们对tomcat,对tomcat应用服务器设计思想,进行了相关的说明。

对tomcat的核心servlet进行一些说明,了解到Servlet容器工作流程。

相关的详情,可以查看这里:Tomcat原理剖析-Tomcat应用服务器设计思想

那么今天我们继续的深入,深入的学习Tomcat整体架构设计。

来吧,继续搬砖喽!!!

image.png

2.2 整体架构设计

1.整体介绍

刚才咱看了Web应用服务器的设计基本原理,其中有具体的HTTP服务器和Servlet容器接下来介绍,具体实现。

Tomcat整体架构总结起来就是: 2 个核心器, 8 个关键组件

设计任何系统架构首先必须了解需求。Tomcat的两个核心需求:

  • 1 ) 接收客户端浏览器发送请求,处理其中Socket连接。将网络字节流与Request和Response对象的转化
  • 2 ) 加载和管理Servlet,以及具体处理Request请求

基于此核心需求,Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别实现对应功能。

由此可见这两个核心的组件,贯穿整个tomcat的核心思想设计。

Catalina大容器

  1. 连接器Coyote:负责对外交流
    • ProtocolHandler
    • Endpoint
    • Processor
    • Adapter
  2. Servlet容器:负责内部处理
    • Engine
    • Host
    • Context
    • Wrapper

一次请求响应,对应一次service服务

image.png

究竟什么是Coyote,那我们来学习一下?继续往下

image.png

2.核心连接器之Coyote

Coyote :是Tomcat服务器提供的供浏览器访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接受响应 。

Coyote 封装了底层的网络通信(Socket 请求及响应处理),将Socket 输入转换封装为 Request 对象,交由Catalina 容器进行处理,处理请求完成后, Catalina 通过 Coyote 提供的Response 对象将结果写入输出流 。

image.png

看到这里我们知道了Coyote的核心作用,就是将Socket 输入转换封装为 Request 对象

并能提供Response 对象将结果写入输出流

那我们来看一下Coyote,内部的结构图。

连接器组件:ProtocolHandler、EndPoint、Processor、Adapter

连接器拆解

连接器Coyote内部组件图:

image.png

对于上面这个图,我们来解析一下,相关组件:

连接器中的各个组件的作用如下:

1.EndPoint :EndPoint用来实现TCP/IP协议的,作为Coyote 通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象。

2.Processor :HTTP协议处理接口 。Processor是对应用层协议的抽象。

  • 如果说EndPoint是用来实现TCP/IP协议的,那么Processor类用来实现HTTP协议。
  • Processor接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理。

3 、ProtocolHandler :ProtocolHandler接口通过Endpoint 和 Processor,实现针对具体协议的处理能力。Tomcat 按照协议和I/O 提供了 6 个实现类 :

  1. Ajp3个:AjpNioProtocol 、AjpAprProtocol、AjpNio2Protocol
  2. HTTP3个:Http11NioProtocol、Http11Nio2Protocol、Http11AprProtocol。

4 、Adapter适配器

由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来“存放”这些请 求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标 准的ServletRequest,也就意味着,不能用Tomcat Request作为参数来调用容器。

Tomcat设计者的解决方案是引入CoyoteAdapter,这是 适配器模式 的经典运用,连接器调用 CoyoteAdapter的Sevice方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器的Service方法。

连接器的IO模型与协议

刚才看了连接器中的核心三个组件,组件中包含了IO模型和应用协议基本概念。

那么我们看一下Tomcat连接器支持的IO模型和网络应用层协议。在连接器Coyote中 , Tomcat支持的多种I/O模型和应用层协议,具体包含哪些IO模型和应用层协议,请看下表:

支持的IO模型(自8.5/9.0 版本起,Tomcat 移除了 对 BIO 的支持):

IO模型 描述
NIO 非阻塞I/O,采用Java NIO类库实现。
NIO2 异步I/O,采用JDK 7最新的NIO2类库实现。
APR 采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库。

协议分层 :

image.png

image.png

3.核心大容器Catalina

Tomcat是一个由一系列可配置的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。

而servlet就是tomcat的核心,catalina是servlet容器,那就说明catalina,也是tomcat的一个核心内容。

Catalina大容器占的绝对C位

image.png

Tomcat 本质上就是一款 Servlet 容器, 因此Catalina 才是 Tomcat 的核心 , 其他模块都是为Catalina提供支撑的。

Coyote连接器模块提供链接通信
Jasper 模块提供JSP引擎
Naming 模块提供JNDI 服务
Juli 提供日志服务。
复制代码

Tomcat 整体架构图:

image.png

那是不是还剩下4个组件呢?这不就来了嘛,别急,都给你讲完。

Catalina组件:Engine、Host、Context、Wrapper

4个组件,分别是Engine、Host、Context和Wrapper。这4个组件不是平行关系,而是父子关系。

Tomcat这种分层架构设计,使得Servlet容器具有很好的灵活性。

组件的关系:

  • 一个Service只有一个Engine
  • 一个Service有多个Connector
  • 一个Engine有多个host
  • 一个Host有多个Context,一个Context表示一个web应用【我们开发就写的是Context】
  • 一个Context有多个Servlet

各个组件的含义 :

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

好了,tomcat的2个核心,8个组件,就分享完了。

2个核心

  • 核心连接器之Coyote
  • 核心大容器Catalina

8个组件

连接器组件:ProtocolHandler、EndPoint、Processor、Adapter

大容器组件:Engine、Host、Context、Wrapper

大家都记住了嘛,好了,关键都不难记,赶紧记忆起来吧。

image.png


好了,以上就是Tomcat原理剖析-Tomcat整体架构设计的分享了。

个人得实操,可能也有些不足,大家轻点喷!!!

个人理解,也可能不够全面,班门弄斧了。

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

image.png

猜你喜欢

转载自juejin.im/post/7130632340639842317