Tomcat 同时扮演网络服务器和 Servlet 容器。Connector 负责把网络字节变成请求,容器层级负责找到 Web 应用与 Servlet,Pipeline/Valve 和 Filter 则在调用前后提供扩展点。
Table of contents
Open Table of contents
运行真正的 Tomcat 请求
下载嵌入式 Tomcat 样例下载:
mvn -Dtest=NetworkServerLabTest#servesOneRequestThroughEmbeddedTomcat test
测试绑定随机端口,注册 /hello Servlet,用 JDK HttpClient 发起请求,最后停止并销毁容器。它验证的是完整网络与容器链路,不是直接调用 Servlet 方法。
Connector 把网络交给容器
**Connector(连接器)**监听端口、接受连接、解析 HTTP,并把底层请求适配为 Servlet 请求。协议处理器、端点、线程池和 Socket 缓冲都属于这一侧。 连接建立数、保持连接数和正在执行请求数不是同一个指标。
当请求解析完成,Connector 把请求交给关联的 Service 和 Engine。反向代理部署还要正确处理可信代理、原始协议和客户端地址,不能盲目信任任意
X-Forwarded-* 请求头。
四层容器怎样定位 Servlet
| 容器 | 表示什么 |
|---|---|
Engine | 一个请求处理引擎 |
Host | 一个虚拟主机,例如域名 |
Context | 一个 Web 应用及其上下文路径 |
Wrapper | 一个具体 Servlet |
请求先按主机和路径映射到 Context,再按 Servlet 映射规则找到 Wrapper。Valve 是 Tomcat 容器 Pipeline 的扩展点;Filter 属于 Servlet 规范,作用在应用内部。 认证、访问日志和业务过滤要放在职责正确的层级。
Servlet 生命周期与并发
容器通常创建一个 Servlet 实例并并发调用其 service 方法。不要把单次请求数据保存在 Servlet 实例字段中;请求状态应该放在局部变量或明确的并发安全组件里。
启动时完成映射和初始化,关闭时停止接流量、等待在途请求、销毁应用资源。后台线程、ThreadLocal、JDBC 驱动和定时任务若未释放,会阻止 WebApp 类加载器回收。
示例使用 Tomcat 11.0.25。Tomcat 官方的版本对应表显示 11.0.x 实现 Servlet 6.1,要求 Java 17 或更高;
旧项目从 javax.* 迁移到 jakarta.* 时必须评估 API 与依赖兼容。
下一步
阅读Tomcat 线程模型与性能调优,把连接、线程、队列和下游容量放进同一个模型。