tomcat架构概览

https://blog.csdn.net/ldw201510803006/article/details/119880100

前言

Tomcat 要实现 2 个核心功能:

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

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

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 中有多个连接器和一个容器。连接器与容器之间通过标准的 ServletRequest 和 ServletResponse 通信

Tomcat组件一览

Tomcat中的核心组件包含Connector和Engine两大类,分别负责对外 处理网络连接,对内处理业务请求

一、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个级别的容器,分别是Engine、Host、Context和Wrapper。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容器对请求进行处理的管道

相关推荐
重生之我要进大厂18 分钟前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
_祝你今天愉快21 分钟前
技术成神之路:设计模式(十四)享元模式
java·设计模式
小筱在线1 小时前
SpringCloud微服务实现服务熔断的实践指南
java·spring cloud·微服务
luoluoal1 小时前
java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)
java·vue.js·spring boot
ChinaRainbowSea1 小时前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
小游鱼KF1 小时前
Spring学习前置知识
java·学习·spring
扎克begod1 小时前
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
java·开发语言·python
青灯文案11 小时前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
我就是程序猿1 小时前
tomcat的配置
java·tomcat
阳光阿盖尔2 小时前
EasyExcel的基本使用——Java导入Excel数据
java·开发语言·excel