0%

tomcat之Catalina

Catalina:Tomcat 的核心 Servlet 容器解析

Catalina 是 Tomcat 的核心组件,负责管理 Servlet 的生命周期、处理 HTTP 请求并协调各组件工作。自 Tomcat 4.0 起,Catalina 成为 Servlet 容器的正式名称,其设计采用模块化架构,通过解析server.xml配置文件构建服务器实例,协调连接器(Connector)与容器(Container)的协作。本文深入解析 Catalina 的工作原理、组件解析流程及核心配置逻辑。

Catalina 的核心定位与架构

Catalina 是 Tomcat 的 “大脑”,承担以下核心职责:

  • 解析server.xml配置文件,创建并管理 Server、Service、Connector、Container 等组件;
  • 协调连接器(接收请求)与容器(处理请求)的交互;
  • 管理 Servlet 的加载、初始化、请求处理及销毁全生命周期;
  • 集成其他模块(如 Coyote 负责通信、Jasper 处理 JSP、JNDI 提供命名服务)。

其架构可简化为:

1
Catalina → Server → Service → (Connector + Container)  
  • Server:顶层组件,代表整个 Tomcat 实例;
  • Service:关联 Connector 与 Container,实现 “接收请求 - 处理请求” 的链路;
  • Connector:处理网络通信,解析 HTTP 请求;
  • Container:处理请求的核心,包含 Engine、Host、Context、Wrapper 四级容器。

Catalina 的启动流程:从配置到组件初始化

Catalina 的启动始于org.apache.catalina.startup.Catalina类,核心步骤包括:

  1. 加载配置:通过load()方法解析server.xml,生成组件对象;
  2. 初始化组件:调用Server.init(),逐层初始化 Service、Connector、Container 等;
  3. 启动服务:调用Server.start(),启动所有组件,监听端口等待请求。

其中,解析server.xml 是核心环节,由Digester工具完成(将 XML 标签映射为 Java 对象)。

Digester:XML 到 Java 对象的转换工具

Catalina 使用Digester(基于 SAX 的 XML 解析工具)将server.xml转换为组件对象。Digester 通过 “规则定义” 关联 XML 标签与 Java 类,例如:

  • 遇到<Server>标签时,创建StandardServer实例;
  • 遇到<Connector>标签时,创建Connector实例并添加到 Service。

核心规则示例

1
2
3
4
5
6
// 创建Server实例(对应<Server>标签)
digester.addObjectCreate("Server",
"org.apache.catalina.core.StandardServer",
"className");
digester.addSetProperties("Server"); // 映射标签属性到对象字段
digester.addSetNext("Server", "setServer", "org.apache.catalina.Server"); // 关联到父组件

server.xml解析:组件创建全流程

Server

server.xml是 Catalina 的 “蓝图”,定义了从 Server 到 Wrapper 的所有组件。以下是关键组件的解析逻辑:

1. Server 组件(顶层服务器)

  • 作用:代表整个 Tomcat 实例,管理多个 Service,监听 8005 端口接收关闭命令。

  • 解析规则

    1
    <Server port="8005" shutdown="SHUTDOWN">...</Server>  
    • port:关闭端口;shutdown:关闭命令字符串(默认 “SHUTDOWN”)。
    • Digester 创建StandardServer实例,通过setServer()方法关联到 Catalina。

2. GlobalNamingResources(全局 JNDI 资源)

  • 作用:定义所有应用共享的 JNDI 资源(如用户数据库)。

  • 解析规则

    1
    2
    3
    <GlobalNamingResources>  
    <Resource name="UserDatabase" type="org.apache.catalina.UserDatabase" ... />
    </GlobalNamingResources>
    • 解析为NamingResourcesImpl实例,通过setGlobalNamingResources()关联到 Server。

3. Listener(生命周期监听器)

  • 作用:监听 Server 的生命周期事件(如启动、关闭),执行初始化或清理操作。
  • 常见监听器
    • VersionLoggerListener:启动时打印版本信息;
    • AprLifecycleListener:加载 APR 库(优化网络性能);
    • JreMemoryLeakPreventionListener:防止 JVM 内存泄漏。

4. Service(服务)

  • 作用:关联 Connector 与 Container,一个 Service 包含多个 Connector 和一个 Engine。

  • 解析规则

    1
    <Service name="Catalina">...</Service>  
    • 解析为StandardService实例,通过addService()关联到 Server。

5. Executor(共享线程池)

  • 作用:为 Connector 提供共享线程池,减少线程创建开销。

  • 解析规则

    1
    <Executor name="tomcatThreadPool" maxThreads="150" minSpareThreads="4" />  
    • maxThreads:最大线程数;minSpareThreads:核心线程数。
    • 解析为StandardThreadExecutor实例,通过addExecutor()关联到 Service。

6. Connector(连接器)

  • 作用:监听端口(如 8080),接收 HTTP 请求并转发给 Container。

  • 解析规则

    1
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />  
    • port:HTTP 端口;protocol:协议(如 “HTTP/1.1”);redirectPort:HTTPS 重定向端口。
    • 解析为Connector实例,通过addConnector()关联到 Service。

7. Engine(Servlet 引擎)

  • 作用:最顶层容器,管理多个虚拟主机(Host),根据域名分发请求。

  • 解析规则

    1
    <Engine name="Catalina" defaultHost="localhost">...</Engine>  
    • defaultHost:默认虚拟主机(需与某 Host 的name匹配)。
    • 解析为StandardEngine实例,通过setContainer()关联到 Service。

8. Host(虚拟主机)

  • 作用:代表一个域名(如localhost),管理多个 Web 应用(Context)。

  • 解析规则

    1
    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">...</Host>  
    • appBase:应用部署目录(默认webapps);autoDeploy:自动部署新增应用。
    • 解析为StandardHost实例,通过addChild()关联到 Engine。

9. Context(Web 应用)

  • 作用:代表一个 Web 应用(如/myapp),管理 Servlet(Wrapper)。

  • 解析规则

    1
    <Context path="/myapp" docBase="/data/myapp" reloadable="true" />  
    • path:访问路径;docBase:应用实际路径;reloadable:是否自动重载类文件。
    • 解析为StandardContext实例,通过addChild()关联到 Host。

10. Valve(阀门)

  • 作用:拦截请求 / 响应,实现日志、安全等功能(类似过滤器)。
  • 常见阀门
    • AccessLogValve:记录访问日志(路径、状态码等);
    • RemoteAddrValve:限制特定 IP 访问。

Catalina 的组件协作:请求处理流程

  1. 接收请求:Connector 监听端口,接收 HTTP 请求并解析为ServletRequest
  2. 转发请求:Connector 将请求交给 Service 关联的 Engine;
  3. 路由请求:Engine 根据域名匹配 Host,Host 根据路径匹配 Context;
  4. 处理请求:Context 找到对应的 Wrapper(Servlet),调用其service()方法;
  5. 返回响应:响应经 Context→Host→Engine→Connector 返回给客户端。

欢迎关注我的其它发布渠道