Tomcat整体架构

一、Tomcat介绍

开源的java web应用服务器,实现了java EE的部分技术规范,如 java servlet、javaServer Pages、 JavaWebSocket等;

核心:http服务器+Servlet容器

二、Tomcat两个核心功能

1、处理Socket连接,负责网络字节流与Request和Response对象的转化

2、 加载和管理servlet,以及具体处理Request请求。

因此,Tomcat设计了两个核心组件,连接器(Connector)和容器(Container),连接器负责处理对外交流,容器负责内部处理;

三、核心组件

1、Server组件

整个Tomcat服务器,包含多组服务,负责管理和启动各个service,同事监听8005端口发来的shutdown命令,用于关闭整个容器;

2、 Service组件

每个Service组件都包含了若干个用于接收客户端的Connector组件和处理请求的Enigine组件。Service组件还包含了若干个Executor组件,每个Executor都是一个线程池,它可以为Service内所有组件提供线程池执行任务。

Tomcat为了实现多种IO模型和应用层协议,一个容器可能对接多个连接器,单独的连接器或者容器都不能对外提供服务,需要把他们组装起来才能工作,组装后的整体叫做Service组件;

Tomcat内可能有多个Service,这样的设计也是出于灵活性考虑。通过Tomcat中配置多个Service,可以实现通过不同的端口来访问同一台机器上部署的不同应用。

最顶层是Server(Tomcat实例),一个Server中有一个或多个Service,一个Server有多个连接器和一个容器;连接器和容器通过ServletRequest和ServletResponse通信;

3、连接器Connector组件

Tomcat 与外部世界的连接器,监听固定端口接收外部请求,传递给 Container,并将

Container 处理的结果返回给外部。

连接器对Servlet容器屏蔽了不同的应用层协议及IO模型,无论是HTTP还是AJp,容器中都是获取到一个标准的ServletRequest对象;

连接器功能:

a、监听网络端口

b、接收网络连接请求

c、读取请求字节流

d、根据具体协议解析字节流,生成统一对象

e、将Tomcat Request对象转换为ServletRequest对象

f、调用Servlet容器获得ServletResponse

g、将ServletResponse转换为Tomcat Response对象

h、将 Tomcat Response 转成网络字节流

将上述功能按照高内聚低耦合进行分析,可分为三个功能:

网络通信,应用层协议解析,Tomcat Request/Response 与 ServletRequest/ServletResponse 的转化;

按照上述拆分对应的三个功能,分别是EndPoint、Processor和Adapter:

EndPoint 负责提供字节流给 Processor;

Processor 负责提供 Tomcat Request 对象给 Adapter;

Adapter 负责提供 ServletRequest 对象给容器。

组件之间通过接口进行交互,变化与非变化部分隔离,增加复用性,降低耦合度;

Tomcat的设计者将网络通信和应用层协议解析放在一起,设计了ProtocolHandler接口;各种协议和通信模型的组合有响应的实现类;

Tomcat还设计了抽象基类来封装稳定的部分;抽象基类AbstractProtocol实现了ProtocolHandler接口;

4、ProtocolHandler组件

连接器用ProtocolHandler来处理网络协议和应用层协议,包含了两个重要部分:EndPoint和Processor;

Endpoint 负责调用底层socket通信,Proccessor负责应用层协议解析;

EndPoint 是一个接口,对应的抽象实现类是 AbstractEndpoint,而AbstractEndpoint 的具体子类,比如在 NioEndpoint 和 Nio2Endpoint 中,有两个重要的子组件:Acceptor 和 SocketProcessor。其中 Acceptor 用于监听 Socket 连接请求。SocketProcessor 用于处理接收到的 Socket 请求,它实现 Runnable 接口,在 Run 方法里调用协议处理组件 Processor 进行处理。为了提高处理能力,SocketProcessor 被提交到线程池来执行,而这个线程池叫作执行器(Executor)。

Processor 用来实现 HTTP/AJP 协议,Processor 接收来自 EndPoint 的 Socket,读取字节流解析成 Tomcat Request 和 Response 对象,并通过 Adapter 将其提交到容器处理,Processor 是对应用层协议的抽象。Processor 是一个接口,定义了请求的处理等方法。它的抽象实现类AbstractProcessor 对一些协议共有的属性进行封装,没有对方法进行实现。具体的实现有AJPProcessor、HTTP11Processor 等,这些具体实现类实现了特定协议的解析方法和请求处理方式。

EndPoint 接收到 Socket 连接后,生成一个 SocketProcessor 任务提交到线程池去处理,SocketProcessor 的 Run 方法会调用 Processor 组件去解析应用层协议,Processor通过解析生成 Request 对象后,会调用 Adapter 的 Service 方法。

5、Adapter组件

ProtocolHandler接口负责解析请求并生成Tomcat Request,Tomcat设计者引入CoyoteAdapter,这是适配器模式的经典运用;连接器调用CoyoteAdapter的Service方法传入Tomcat Request对象,CoyoteAdapter负责将对象转为ServletRequest,再调用容器中的Service方法;

相关推荐
鱼跃鹰飞1 小时前
设计模式系列:工厂模式
java·设计模式·系统架构
a努力。1 小时前
国家电网Java面试被问:混沌工程在分布式系统中的应用
java·开发语言·数据库·git·mysql·面试·职场和发展
Yvonne爱编码1 小时前
Java 四大内部类全解析:从设计本质到实战应用
java·开发语言·python
J2虾虾1 小时前
SpringBoot和mybatis Plus不兼容报错的问题
java·spring boot·mybatis
毕设源码-郭学长2 小时前
【开题答辩全过程】以 基于springboot 的豪华婚车租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Tao____4 小时前
通用性物联网平台
java·物联网·mqtt·低代码·开源
曹轲恒4 小时前
SpringBoot整合SpringMVC(上)
java·spring boot·spring
JH30735 小时前
Java Spring中@AllArgsConstructor注解引发的依赖注入异常解决
java·开发语言·spring
码农水水5 小时前
米哈游Java面试被问:机器学习模型的在线服务和A/B测试
java·开发语言·数据库·spring boot·后端·机器学习·word
2601_949575865 小时前
Flutter for OpenHarmony二手物品置换App实战 - 表单验证实现
android·java·flutter