内部组件与流程

Catalina 容器

Catalina 是 Apache Tomcat 的 Servlet 容器实现,其主要职责包括:

  • 解析 HTTP 请求并调用对应的 Servlet
  • 管理 Servlet 的生命周期(加载、初始化、销毁)
  • 提供标准的 Servlet API 支持
  • 支持 Session 管理、Cookie 处理
  • 集成 JSP 编译、JNDI 查找、用户认证等容器级功能

Catalina 的架构是典型的容器嵌套结构,核心接口是 org.apache.catalina.Container:

Engine (顶级容器)
 └── Host (虚拟主机)
      └── Context (Web应用)
           └── Wrapper (单个Servlet)
  • Engine:StandardEngine,代表整个 Catalina 引擎,可以配置多个虚拟主机(Host)
  • Host,StandardHost:表示一个虚拟主机,对应 server.xml 中的 配置
  • Context,StandardContext:表示一个 Web 应用,通常对应一个 WAR 包或一个 webapps 子目录
  • Wrapper,StandardWrapper:表示一个 Servlet(如 LoginServlet)

这些容器都是 Container 接口的实现,支持递归嵌套与生命周期管理(start、stop、init)


分层结构

Tomcat 是有一个由一系列配置(conf/server.xml)的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。

从另一个角度来说,Tomcat 本质上就是一款 Servlet 容器,因为 Catalina 才是 Tomcat的核心,其他模块都是为 Catalina 提供支撑的,比如:Coyote 模块提供链接通信,Jasper模块提供JSP引擎,Naming提供JNDI服务,Juli提供日志服务。


容器结构

我们可以认为整个 Tomcat 就是一个 Catalina 实例,Tomcat 启动的时候会初始化这个个例,Catalina 实例通过加载 server.xml 完成其他实例的创建,创建并管理一个 Server,Server创建管理多个服务,每个服务又可以有多个Connector和一个Container。

● 一个 Catalina 实例 ● 一个 Server 实例 ● 多个 Service 实例

每一个 Service 实例下可以有多个 Connector 和 一个 Container 实例

Catalina:负责解析Tomcat配置文件(server.xml),以此来创建服务器Server 组件并进行管理 ● Server:服务器表示整个Catalina Servlet容器以及其他组件,负责组装并启动Servlet引擎,Tomcat连接器,Server通过实现LifeCycle接口,提供了一种优雅的启动和关闭整个系统的方式 ● Service:服务是Server内部的组件,一个Server包含多个Service,它将若干个Connector组件绑定到一个Container ● Container:容器,负责处理用户的Servlet请求,并返回给对象给Web用户的模块


Container 具体结构

Container 组件下有几种具体的组件,分别是 Engine、Host、Context 和 Wrapper。这 4 种组件是父子关系,Tomcat 通过一种分层的架构,使得 Servlet 容器具有很好的灵活性。

Engine:表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可以包含多个Host ● Host:代表一个虚拟主机,或者说一个站点,可以给Tomca配置多个虚拟主机地址,而一个虚拟主机下可能包含多个Context ● Context:表示一个Web应用程序,一个Web应用可以包含多个Wrapper ● Wrapper:表示一个Servlet,Wrapper作为容器中的最低层,不能包含子容器。上述组件的配置其实就是 conf/server.xml 中


启动流程

Catalina 的启动流程可以通过 bin/startup.sh 脚本追溯到底层 Java 类:

startup.sh 脚本调用 catalina.sh catalina.sh 会执行:java org.apache.catalina.startup.Bootstrap start

Bootstrap 类完成以下几件事:

  • 加载 catalina.jar
  • 创建并初始化 Catalina 实例
  • 调用 catalina.load() 加载 server.xml 配置
  • 调用 catalina.start() 启动服务(包含 Connector 和 Container)

线程处理机制

Catalina 是基于线程池来处理请求的:

  • 每个 Connector 内部使用线程池(如 org.apache.tomcat.util.threads.ThreadPoolExecutor)
  • 请求进入后会转化为 HttpServletRequest/Response,交由对应的 Wrapper 执行 Servlet

这种机制既能高并发处理请求,也可通过配置限制最大线程数量(防止 OOM)。