介绍

Tomcat是全世界最著名的基于Java语言的轻量级应用服务器,是一款完全开源免费的Servlet容器实现。同时,它支持HTML、JS等静态资源的处理,因此又可以作为轻量级Web服务器使用

图说架构设计

1. Server

通过start()方法启动服务器,打开Socket链接,监听服务器端口,并负责在接收到客户端请求时进行处理并返回。同时提供一个stop()方法来停止服务器并释放网络资源。

image-20250830185254046

2. Connector和Container

  • 隔离网络协议和请求处理。

    1
    一个Server可以包含多个Connector和Container。其中Connector负责开启Socket并监听请求、返回响应数据。Container负责具体的请求处理,

    image-20250830190203773

  • 优化

    1
    一个Server包含多个Service,共享一个JVM以及系统类库

    image-20250830190332336

  • 优化

    为了和Tomcat保持一致,将Container重命名为Engine,用以表示Servlet引擎。

    image-20250830190433820

3. Container设计

3.1 Context

  • Context

    Context表示一个Web应用,一个Engine可以包含多个Context

image-20250830213542686

  • Host

​ Host表示虚拟主机,一个Context可以包含多个Host

image-20250830213813081

  • Servlet

    一个Web应用中可以包含多个Servlet实例以处理来自不同链接的请求

image-20250830213959642

  • Container

    使用Container表示容器,因此Engine、Host、Context、Wrapper均继承自Container;Tomcat的Container可以表示不同的概念级别:Servlet引擎、虚拟主机、web应用、Servlet。

image-20250830214842652

3.2 Lifecycle

生命周期管理接口,支持组件状态以及状态之间的转换,支持添加事件监听器用于监听组件的状态变化

1
2
3
4
init():初始化组件
start():启动组建
stop():停止组件
destroy():销毁组件

image-20250830215631069

3.3 Pipeline和Value

提升每个组件的灵活性,使其方便扩展;Tomcat使用了责任链模式来处理客户端请求。定义Pipeline和Value两个接口,前者用于构造责任链,后者表示责任链上的处理器;来自客户端的请求像是流经管道的水一样,经过每一个阀进行处理。

image-20250830220913077

Pipeline中维护了一个基础的Value,它始终位于Pipeline的尾端最后执行,封装了具体的请求和输出响应的过程。然后,通过addValue()方法,我们可以为Pipeline添加其他的Value,后面添加的Value位于基础的Value之前,并按照添加顺序执行。Pipeline通过获得首个Value来启动整个链条的执行。

Tomcat容器组件的灵活之处在于,每一个层级的容器都有对应的Value实现,同时维护了一个Pipeline实例,也就是说,我们可以在任何层级的容器上对请求进行处理。

image-20250830221626952

4. Connectar设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
功能:
- 监听服务器端口,读取来自客户端的请求
- 将请求按照指定的协议进行解析
- 根据请求地址匹配正确的容器进行处理
- 将响应返回给客户端

多协议支持:
- HTTP
- AJP

多IO方式支持:
- BIO
- NIO
- APR
- NIO2

image-20250830222817832

ProtocolHandler表示协议处理器,针对不同的协议和IO方式,提供了不同的实现;比如:Http11NioProtocol

包含一个Endpoint用于启动Socket监听,该接口按照IO方式进行分类实现;比如:Nio2Endpoint

还包含了一个Processor用于按照指定的协议读取数据,并将请求交由容器处理。比如:Http11NioProcessor

Mapper:维护容器映射信息,按照映射规则查找容器

MapperListener:实现了ContainerListener和LifecycleListener,用于在容器组件状态发生变化时,注册或者取消对应的容器映射信息。

总的来说,Connector启动时候,Endpoint会启动线程来监听服务端口,并在接收到请求后调用Processor进行数据读取。

image-20250830224920712

4.1 Executor

image-20250830225727454

4.2 Bootstrap和Catalina

Tomcat通过类Catalina提供了一个shell程序,用于解析server.xml创建各个组件,同时负责启动、停止应用服务器。

Tomcat使用Digester解析XML文件,包括server.xml以及web.xml等

最后,Tomcat提供了Bootstrap作为应用服务器启动入口,Bootstrap负责创建Catalina实例,根据参数调用Catalina相关方法完成针对应用服务器的操作。

Ps:Tomcat提供了一个同名类org.apache.catalina.startup.Tomcat,使用它我们可以将Tomcat服务器嵌入到我们的应用服务并进行使用。

image-20250830230450995


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.