Tomcat 介绍
Tomcat 是 Apache 软件基金会开发的一个开源 Java Servlet 容器,用于运行 Java Web 应用程序。它实现了多个 Java EE 规范,如 Servlet、JSP(Java Server Pages)和 WebSocket 等,主要用于处理动态网页请求。作为一个轻量级的应用服务器,Tomcat 常用于开发和测试环境中,同时也适用于生产环境中的中小型应用。
Tomcat 架构
在 Tomcat Server 中,核心架构主要由三个组件组成:Service、Connector 和 Container。它们共同构成了 Tomcat 的请求处理和应用管理机制。
以下是对这三个组件的介绍:
Service (服务)
- 功能:
Service是 Tomcat 中用于组织和管理多个Connector和一个Container的组件。它负责协调客户端连接和容器之间的关系。 - 结构:一个
Service包含一个Container(通常是Engine)和多个Connector。Service的目的是在多个客户端请求和后端的 Web 应用之间建立桥梁。 - 工作机制:当请求通过
Connector接入时,Service会负责将这些请求分发给Container处理。Service也是多个连接器共享一个Container的桥梁。
Connector (连接器)
- 功能:
Connector负责处理客户端和 Tomcat 服务器之间的通信。它将客户端的请求转换成 Tomcat 可以理解的请求对象,并将响应返回给客户端。 - 协议支持:Connector 支持多种协议,如 HTTP、HTTPS 和 AJP 。常见的连接器包括:
- HTTP Connector:用于处理标准的 HTTP 请求。
- AJP Connector:用于在 Tomcat 和其他 Web 服务器(如 Apache HTTP Server)之间使用 AJP 协议进行通信。
- 工作机制:
Connector接受客户端的网络连接请求,然后将这些请求传递给Service中的Container进行进一步处理。
Container (容器)
- 功能:
Container是 Tomcat 中用于处理请求的核心组件。它负责解析和处理通过Connector接收到的请求,并生成相应的响应。 - 层级结构:Container 包含四种子容器(Engine、Host、Context 和 Wrapper):
- Engine:最顶层的容器,表示整个 Servlet 引擎。它负责处理通过
Connector接收到的所有请求。一个 Tomcat 实例通常只包含一个Engine,它在接受请求后将其分发到相应的Host。 - Host:表示一个虚拟主机。一个
Host代表一个能够承载多个应用的虚拟主机,通常与一个域名相对应。它允许 Tomcat 在同一台服务器上支持多个域名(虚拟主机)。 - Context:代表单个 Web 应用,管理该应用的生命周期。所有的 Servlet、过滤器、监听器等都运行在
Context中。 - Wrapper:包装一个具体的 Servlet,处理最终的请求。
- Engine:最顶层的容器,表示整个 Servlet 引擎。它负责处理通过
- 工作机制:当
Container接收到Connector传递的请求时,它会逐级解析请求,最终将请求交给正确的Servlet进行处理。
Tomcat Context
Tomcat 中有三种 Context :ServletContext、StandardContext、ApplicationContext
ServletContext
- 接口:
ServletContext是一个接口,提供了访问和管理 web 应用程序共享资源的能力。它为所有 servlets 提供全局的视图。 - 获取方式:通过
request.getServletContext()可以获取到ApplicationContextFacade对象,它是ServletContext的一个实现类的包装器,用于保护实际的ServletContext实现不被直接操作。 - 共享性:
ServletContext是在 web 容器启动时为每个 web 应用创建的,它在应用的生命周期内有效,并且在同一应用的所有 servlets 之间共享。因此,它代表当前 web 应用,可以访问应用的资源和设置。
ApplicationContext
- 实现类:
ApplicationContext是ServletContext接口的一个具体实现类。在 Tomcat 中,ApplicationContext被封装在ApplicationContextFacade中,主要用于提供对ServletContext的安全访问。 - 功能:
ApplicationContext实现了ServletContext中的方法,因此,它可以管理 web 应用的全局资源、配置初始化参数以及共享属性。 - 作用:实际上,
ApplicationContext是对StandardContext的进一步封装,ApplicationContext中的方法会调用StandardContext中的对应方法,形成对 web 应用的实际管理。
StandardContext
- 核心实现:
StandardContext是 Tomcat 中org.apache.catalina.Context接口的默认实现类。它表示一个完整的 web 应用,并且是 Tomcat 用于管理应用生命周期、配置、加载和运行的实际Context实现。 - 功能与作用:
- 负责管理整个 web 应用的生命周期(启动、停止、重载等)。
- 管理应用的所有 servlets、filters、listeners 等组件。
- 提供对应用的资源路径、JNDI 资源、会话管理等功能的支持。
- 关系:
StandardContext是 Tomcat 内部的核心组件,负责实现Context接口的所有功能,并为ApplicationContext提供实际的支持。ApplicationContext调用的很多方法最终都会映射到StandardContext的实现中。
Tomcat 管道机制
Tomcat 管道机制(Pipeline Mechanism) 是 Tomcat 内部的请求处理模型之一,它提供了一种灵活的、可扩展的处理请求和响应的方式。管道机制允许在请求和响应处理过程中插入多个可配置的处理器(Valve),这些处理器按顺序执行,形成一个请求处理的链条。
Pipeline 和 Valve 的关系
在 Tomcat 中,Pipeline(管道) 是容器(如 Engine、Host、Context 等)的一个组件,用来组织多个 Valve(阀门)。Valve 是一个个的请求处理器,而 Pipeline 负责管理这些 Valve 的顺序调用。
Tomcat 中,管道就像一个请求处理的通道,而 Valve 是放在管道中的处理站。每个请求进入 Tomcat 时,会沿着这个管道依次经过各个 Valve,直到最终处理完成。
- Pipeline:是一个容器,它维护一系列的 Valve,形成一个处理链。
- Valve:是管道中的节点,执行特定的请求处理逻辑。
Pipeline 结构
Tomcat 的 Pipeline 由以下两部分组成:
- 基本 Valve(Basic Valve):每个管道都必须有一个基本 Valve,它是管道中最后一个被调用的 Valve,负责实际的请求处理(如转发请求给某个特定的 Servlet)。如果没有其他的自定义 Valve 进行拦截或修改,最终的请求会由基本 Valve 处理。
- 普通 Valve:可以在基本 Valve 之前插入多个普通的 Valve,这些 Valve 按照配置的顺序依次执行。
工作原理
当请求进入 Tomcat 时,经过容器(如 Engine、Host、Context 等)的 Pipeline,Pipeline 中的 Valve 会按顺序执行,处理请求并决定是否传递给下一个 Valve。如果某个 Valve 拦截了请求并处理完成,可能会终止后续 Valve 的调用。
执行过程:
- 请求进入某个容器的 Pipeline。
- Pipeline 从第一个 Valve 开始,依次调用每个 Valve 的
invoke()方法。 - 每个 Valve 处理请求并决定是否传递给下一个 Valve。如果需要传递,调用
getNext().invoke(request, response)。 - 如果没有下一个 Valve,最终由 Basic Valve 处理请求。
Tomcat 每个层级的容器(Engine、Host、Context、Wrapper),都有基础的 Valve 实现(StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve),他们同时维护了一个 Pipeline 实例(StandardPipeline),也就是说,我们可以在任何层级的容器上针对请求处理进行扩展。这四个 Valve 的基础实现都继承了 ValveBase。这个类帮我们实现了生命接口及 MBean 接口,使我们只需专注阀门的逻辑处理即可。
参考文章