IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Tomcat整体架构 -> 正文阅读

[Java知识库]Tomcat整体架构


前言

Tomcat 要实现 2 个核心功能:

  • 处理 Socket 连接,负责网络字节流与 RequestResponse 对象的转化。
  • 加载和管理 Servlet,以及具体处理 Request 请求。

因此 Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。

Tomcat 支持的多种 I/O 模型和应用层协议

Tomcat 支持的 I/O 模型有:

  • NIO:非阻塞 I/O,采用 Java NIO 类库实现。
  • NIO.2:异步 I/O,采用 JDK 7 最新的 NIO.2 类库实现。
  • APR:采用 Apache 可移植运行库实现,是 C/C++ 编写的本地库。

Tomcat 支持的应用层协议有

  • HTTP/1.1:这是大部分 Web 应用采用的访问协议。
  • AJP:用于和 Web 服务器集成(如 Apache)。
  • HTTP/2:HTTP 2.0 大幅度的提升了 Web 性能

Tomcat 为了实现支持多种 I/O 模型应用层协议,一个容器可能对接多个连接器,就好比一个房间有多个门。但是单独的连接器或者容器都不能对外提供服务,需要把它们组装起来才能工作,组装后这个整体叫作 Service 组件。Service 本身没有做什么重要的事情,只是在连接器和容器外面多包了一层,把它们组装在一起。Tomcat 内可能有多个 Service,这样的设计也是出于灵活性的考虑。通过在 Tomcat 中配置多个 Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。

最顶层是 Server,这里的 Server 指的就是一个 Tomcat 实例。一个 Server 中有一个或者多个 Service,一个 Service 中有多个连接器和一个容器。连接器与容器之间通过标准的 ServletRequestServletResponse 通信

Tomcat组件一览

Tomcat中的核心组件包含ConnectorEngine两大类,分别负责对外 处理网络连接,对内处理业务请求
在这里插入图片描述

一、Tomcat核心组件

1、Server组件

Server是最顶级的组件,代表Tomcat运行的实例,在一个JVM中只会包含一个Server,包含:

  • Listener组件:在Server的整个生命周期中,不同阶段会有不同的会有不同的事情要完成,为扩展方便,它因此引入了监听器方式
  • GlobalNamingResources组件:方便在Tomcat中集成JNDI
  • Service核心组件

2、Service组件

一个Server组件下可以包含多个Service组件,每个Service组件包含多个接收消息的Connector组件和处理请求的Engine组件。其中,不同的Connector组件使用不同的通信协议,如HTTP协议和AJP协议
在这里插入图片描述

3、Connector组件

主要职责是负责接收客户端连接并接收消息报文并解析,然后交给容器处理。因为要支持不同的协议,因此需要不同的Connector组件,每种协议对应一个Connector组件;目前Tomcat包含HTTP和AJP两种协议的Connector。根据网络I/O模型的不同方式,分为阻塞I/O非阻塞I/O在这里插入图片描述

  • Http11Protocal组件,是Http1.1版本的抽象,它包含接收客户端连接、接收客户端消息报文、报文解析处理、对客户端的响应等过程;主要由JIoEndpoint组件和Http11Processor组件组成
  • Mapper组件:客户端请求的路由映射组件,可以将一个完整的路由映射到对应的Servlet
  • CoyoteAdaptor组件,将Connector和Container适配起来的适配器
    在这里插入图片描述
    可以发现,非阻塞模式相比阻塞模式多个一个Poller组件,该组件的职责是在非阻塞I/O方式下轮询多个客户端连接,不断检测(I/O连接是否就绪)、处理各种事件

4、Engine组件

Tomcat内部有4个级别的容器,分别是EngineHostContextWrapper。Engine代表全局Servlet引擎,每个Service组件只能包含一个Engine容器组件,但Engine组件能包含多个Host容器。除Host外,还包含一下几个组件

  • Listener组件:可以在Tomcat生命周期中完成某些Engine容器相关工作的监听器
  • AccessLog组件:客户端访问日志,所有的客户端访问都会被记录
  • Cluster组件:提供集群功能,可以将Engine容器需要的共享数据同步到集群中的其他Tomcat 实例上
  • Pipeline组件:Engine容器对请求进行处理的管道
  • Realm组件:安全管理器,提供了Engine容器级别的用户 - 密码 - 权限的数据对象,配合资源认证模块使用

5、Host组件

Tomcat中Host组件代表虚拟的主机,这些虚拟主机可以放在若干Web应用中的抽象(Context容器)。除了Context组件外,还包含如下组件:

  • Listener组件:可以在Tomcat生命周期中完成Host容器相关工作的监听器
  • AccessLog组件:客户端的访问日志,对该虚拟主机上所有的Web应用的访问日志都会被记录
  • Cluster组件:提供集群功能,可以将Host容器需要共享的数据同步到集群中的其他Tomcat实例上
  • Pipeline组件:Host容器对请求进行处理的管道
  • Realm组件:安全管理器,提供了Host级别的用户 - 密码 - 权限的数据对象,配合资源认证模块使用

6、Context组件

Context这一级别,也就对应了我们的Web应用了。一个Context容器对应一个部署的Web应用。包含各种静态资源、若干Servlet(Wrapper容器)以及各种其他动态资源。主要包括如下组件:

  • Listener组件:可以在Tomcat生命周期中完成某些Context容器相关工作的监听器
  • AccessLog组件:客户端的访问日志,对该Web应用的访问都会被记录
  • Pipeline组件:Context容器对请求进行处理的管道
  • Realm组件:安全管理器,提供了Context容器级别的用户-密码-权限的数据对象,配合资源认证模块使用
  • Loader组件:Web应用加载器(这个不是类加载器,里面包含了类加载器),用于加载Web应用的资源,它要保证不同Web应用之间的资源隔离
  • Manager组件:会话管理器,用于管理对应Web容器的会话,包括维护会话的生成、更新和销毁
  • NamingResource: 命名资源,负责Tomcat配置文件的server.xml和Web应用的context.xml资源和属性映射到内存中
  • Wrapper组件:Context的核心子容器,也是Servlet的包装容器

7、Wrapper组件

对Servlet做了一层包装,一个Wrapper对应一个Servlet,包含如下组件:

  • Servlet组件:Servlet即Web应用开发常用的Servlet,我们会在Servlet中编写好请求的逻辑处理
  • ServletPool组件:Servlet对象池,当Web应用的Servlet实现了SingleThreadModel接口时则会在Wrapper中产生一个Servlet对象池。线程执行时,需先从对象池中获取到一个Servlet对象,ServletPool组件能保证Servlet对象的线程安全
  • Pipeline组件:Wrapper容器对请求进行处理的管道

二、请求处理整体过程

从整体上看一下客户端从发起请求到响应的整个请求在Tomact内部的流转过程
在这里插入图片描述
这里假定Tomcat处理Http请求的服务器,并且使用阻塞I/O方式接受客户端的连接。具体过程如下:

  • 当Tomcat启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接接收Socket
  • 一旦监听到I/O事件就绪的客户端连接,则将连接交给线程池Executor处理,开始执行请求响应任务
  • Http11Processor组件负责从客户端连接中读取消息报文,然后开始解析Http的请求行、请求头、请求体。将解析后的报文封装成Request对象,方便后续处理时通过Request对象获取Http协议的相关信息
  • Mapper组件根据Http协议请求行的URL属性和请求头的Host属性值匹配由哪个Host容器、哪个Context容器、哪个Wrapper容器处理请求,也就是要找到具体的Servlet。然后将路由的结果封装在Request对象中,方便后续处理通过Request对象选择容器
  • CoyoteAdaptor组件负责将Connector组件和Engine容器连接起来,把前面处理过程中生成的请求对象Request和响应对象Response传递到Engine容器,调用它的管道
  • Engine容器的管道开始处理请求,管道里包含若干个阀门(Value),每个阀门负责某些逻辑处理。我们可以根据自己的需求往这个管道中添加阀门,首先执行xxxValue,然后执行基础阀门EngineValue,它会调用Host容器的管道
  • Host容器的管道开始处理请求,同样也包含多个阀门,首先执行这些阀门,然后执行基础阀门HostValue,它继续调用Context容器的管道
  • Context容器的管道开始处理请求,首先执行若干阀门,然后执行基础阀门ContextValue,它负责调用Wrapper容器的管道
  • Wrapper容器的管道开始处理请求,首先执行若干阀门,然后执行基础阀门WrapperValue,它会执行该Wrapper容器对应的Servlet对象的处理方法,对请求进行逻辑处理(到这里就会调用我们的业务逻辑了),并将结果输出到客户端






相关参考

Tomcat内核设计剖析[汪建]

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:44:09  更:2021-08-27 11:45:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:06:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码