Tomcat 中的 Pipeline 与 Valve:请求处理的责任链模式
Tomcat 的 Pipeline(管道)和 Valve(阀门)是其核心组件,用于处理请求和响应的流程控制。它们基于责任链模式设计,将请求处理的不同任务拆解为独立的阀门,通过管道串联执行,实现了请求处理逻辑的解耦与灵活扩展。本文将深入解析 Pipeline 与 Valve 的工作原理、结构及配置方式。
Pipeline 与 Valve 的核心概念
基本定义
- Pipeline(管道):
每个 Tomcat 容器(Engine、Host、Context、Wrapper)都包含一个 Pipeline,它是一个任务执行链,负责按顺序调用一系列 Valve 处理请求。 - Valve(阀门):
每个 Valve 代表一个具体的处理任务(如日志记录、权限校验、请求转发等),类似于过滤器(Filter),但作用于 Tomcat 容器级别而非 Web 应用级别。 - Basic Valve(基础阀门):
每个 Pipeline 必须包含一个 Basic Valve,作为管道的最终处理器(责任链的终点),负责执行容器的核心逻辑(如Wrapper的 Servlet 调用、Host的虚拟主机路由)。
设计思想:责任链模式
Pipeline 与 Valve 的设计借鉴了责任链模式,其核心特点是:
- 每个 Valve 只处理自己负责的任务,处理完成后将请求传递给下一个 Valve。
- 可通过添加 / 移除 Valve 灵活扩展请求处理逻辑,无需修改原有代码。
- 不同容器的 Pipeline 独立工作,形成层级化的处理流程(如 Engine → Host → Context → Wrapper)。
Pipeline 与 Valve 的结构与实现
容器与 Pipeline 的对应关系
Tomcat 的四大容器(从顶层到应用层)均内置 Pipeline: