侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Tomcat工作原理介绍

再见理想
2022-05-27 / 0 评论 / 0 点赞 / 313 阅读 / 2,753 字

前言

Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。

一,Tomcat整体架构

1.1 Http 服务器请求处理

浏览器发给服务端的是一个HTTP格式的请求,HTTP 服务器不直接调用业务类,而是把请求交给容器来处理,容器通过 Servlet 接口调用业务类。因此 Servlet 接口和 Servlet 容器的出现,达到了 HTTP 服务器与业务类解耦的目的。而 Servlet 接口和 Servlet 容器这一整套规范叫作Servlet 规范。Tomcat 按照 Servlet 规范的要求实现了 Servlet 容器,同时它们也具有 HTTP 服务器的功能。我们要实现新的业务功能,只需要实现一个 Servlet,并把它注册到 Tomcat(Servlet 容器)中,剩下的事情就由 Tomcat 帮我们处理了。

1.2 Servlet 容器工作流程

当客户请求某个资源时,HTTP 服务器会用一个 ServletRequest 对象把客户的请求信息封装起来,然后调用 Servlet 容器的 service 方法,Servlet 容器拿到请求后,根据请求的 URL 和 Servlet 的映射关系,找到相应的 Servlet,如果 Servlet 还没有被加载,就用反射机制创建这个Servlet,并调用 Servlet 的 init 方法来完成初始化,接着调用 Servlet 的 service 方法来处理请求,把 ServletResponse 对象返回给 HTTP 服务器,HTTP 服务器会把响应发送给客户端。

1.3 Tomcat 整体架构

Tomcat 的两个核心功能:

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

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

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

二,连接器 - Coyote

2.1 Coyote 介绍

Coyote 是 Tomcat 的连接器框架的名称 ,只负责具体协议和 IO 的相关操作,是 Tomcat 服务器提供的供客户端访问的外部接口。客户端通过Coyote 与服务器建立连接、发送请求并接受响应 。

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

2.2 IO 模型与协议

在Coyote中 , Tomcat 支持的 I/O 模型有 NIO,NIO2,APR等,自8.5/9.0 版本起,Tomcat 移除了 对 BIO 的支持。 支持的应用层协议有HTTP/1.1 ,AJP,HTTP/2等。协议分层图:

Tomcat为了实现支持多种I/O模型和应用层协议,一个容器可能对接多个连接器。但是单独的连接器或者容器都不能对外提供服务,需要把它们组装起来才能工作,组装后这个整体叫作 Service组件

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

2.3 连接器组件

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

2.3.1 EndPoint

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

Tomcat 并没有 EndPoint 接口,而是提供了一个抽象类 AbstractEndpoint , 里面定义了两个内部类:Acceptor 和 SocketProcessor。Acceptor 用于监听 Socket 连接请求。SocketProcessor 用于处理接收到的 Socket 请求,它实现Runnable接口,在 Run 方法里调用协议处理组件 Processor 进行处理。为了提高处理能力,SocketProcessor 被提交到线程池来执行。而这个线程池叫作执行器(Executor),tomcat 调优中可以调整线程池的大小

2.3.2 Processor

Coyote 协议处理接口 ,用来实现 HTTP 协议,Processor 接收来自 EndPoint 的Socket,读取字节流解析成 Tomcat Request 和 Response对象,并通过 Adapter 将其提交到容器处理,Processor 是对应用层协议的抽象。

2.3.3 ProtocolHandler

Coyote 协议接口, 通过Endpoint 和 Processor , 实现针对具体协议的处理能力。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol。我们在配置tomcat/conf/server.xml 时 , 至少要指定具体的ProtocolHandler , 当然也可以指定协议名称 , 如 : HTTP/1.1 ,如果安装了APR,那么将使用Http11AprProtocol , 否则使用 Http11NioProtocol 。

2.3.4 Adapter

ProtocolHandler 接口负责解析请求并生成 Tomcat Request 类。但是这个Request对象不是标准的 ServletRequest。Tomcat 设计者的解决方案是引入 CoyoteAdapter,这是适配器模式的经典运用,连接器调用 CoyoteAdapter 的 Sevice 方法,传入的是 TomcatRequest 对象,CoyoteAdapter 负责将 TomcatRequest 转成 ServletRequest,再调用容器的 Service 方法。

三,容器 - Catalina

3.1 Catalina 介绍

Tomcat 是一个由一系列可配置的组件构成的 Web 容器,而 Catalina 是 Tomcat 的 servlet 容器。Catalina 是 Servlet 容器实现,包含了之前讲到的所有的容器组件,以及后续章节涉及到的安全、会话、集群、管理等 Servlet 容器架构的各个方面。它通过松耦合的方式集成 Coyote,以完成按照请求协议进行数据读写。同时,它还包括我们的启动入口、Shell 程序等。

3.2 Catalina 结构

Catalina 负责管理 Server,而 Server 表示着整个服务器。Server下面有多个服务 Service,每个服务都包含着多个连接器组件Connector(Coyote 实现)和一个容器组件 Container。在 Tomcat 启动的时候, 会初始化一个 Catalina 的实例。

Catalina 各个组件的职责:

1,Catalina:负责解析 Tomcat 的配置文件 , 以此来创建服务器 Server 组件,并根据命令来对其进行管理。

2,Server:表示整个 Catalina Servlet 容器以及其它组件,负责组装并启动 Servlet 引擎,Tomcat 连接器。Server通过实现 Lifecycle 接口,提供了一种优雅的启动和关闭整个系统的方式。

3,Service:服务是 Server 内部的组件,一个 Server 包含多个 Service。它将若干个 Connector 组件绑定到一个 Container(Engine)上。

4,Connector:连接器,处理与客户端的通信,它负责接收客户请求,然后转给相关的容器处理,最后向客户返回响应结果。

5,Container:容器,负责处理用户的 servlet 请求,并返回 ServletResponse 对象。

3.3 Container 结构

Container是容器的父接口,它由四个自容器组件构成,分别是 Engine、Host、Context 和Wrapper。这4种容器不是平行关系,而是父子关系。Tomcat通过一种分层的架构,使得Servlet容器具有很好的灵活性。

各个组件的含义 :

1,Engine:它只定义了一些基本的关联关系

2,Host:Host 是 Engine 的子容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。

3,Context:Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。

Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,通过 request 分配来获取子容器。

4,Wrapper:Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。 Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

Tomcat采用了组件化的设计,它的构成组件都是可配置的,其中最外层的是Server,其他组件按照一定的格式要求配置在这个顶层容器中。

Tomcat是怎么管理这些容器的呢?你会发现这些容器具有父子关系,形成一个树形结构,你可能马上就想到了设计模式中的组合模式。没错,Tomcat就是用组合模式来管理这些容器的。 具体实现方法是,所有容器组件都实现了 Container 接口,因此组合模式可以使得用户对单容器对象和组合容器对象的使用具有一致性。这里单容器对象指的是最底层的 Wrapper,组合容器对象指的是上面的 Context、Host 或者Engine。

Container接口扩展了LifeCycle接口,LifeCycle接口用来统一管理各组件的生命周期。

四,Tomcat 启动流程

Tomcat 启动流程

五,Tomcat 请求处理流程

Tomcat 请求处理流程

六,Tomcat 的热加载和热部署

Tomcat 的热加载和热部署

七,Tomcat 如何打破双亲委派机制

打破双亲委派机制
Tomcat是如何打破双亲委派机制的
简书:聊聊JDBC是如何破坏双亲委派模型的

八,Tomcat 安全机制

Tomcat 6 — 你很少使用的安全管理SecurityManager

0

评论区