Tomcat
Tomcat 基础概念
Tomcat 是一个开源的 Servlet 容器,由 Apache 软件基金会开发,用于运行 Java Web 应用程序。它实现了 Servlet 和 JSP 规范,能够处理 HTTP 请求,并为 Web 应用提供运行环境。
核心功能与组件
-
连接器(Connector):负责接收客户端请求并将其转发给容器处理。常见的连接器有 HTTP/1.1 和 HTTP/2。
-
容器(Container):处理请求的核心组件,包含四个层级:
- Engine:顶级容器,处理所有虚拟主机的请求
- Host:虚拟主机,管理多个 Web 应用
- Context:代表一个 Web 应用
- Wrapper:表示一个 Servlet
-
生命周期管理:Tomcat 组件实现了
Lifecycle
接口,支持统一的生命周期管理(init、start、stop、destroy)。 -
类加载机制:采用双亲委派模型,保证类加载的一致性和安全性。
配置与部署
-
server.xml:主配置文件,定义服务器结构、连接器和虚拟主机。
-
web.xml:Web 应用的部署描述符,定义 Servlet、过滤器和安全约束。
-
应用部署方式:
- 将 WAR 文件放置在
webapps/
目录 - 在
conf/Catalina/localhost/
下创建 XML 配置文件 - 使用管理界面部署
- 将 WAR 文件放置在
高级特性
-
集群与负载均衡:支持 Session 复制和分布式部署,通过 mod_jk 或 mod_proxy 与 Apache HTTP Server 集成。
-
安全增强:
- 支持 SSL/TLS 配置
- 基于角色的访问控制
- 安全管理器限制系统资源访问
-
性能优化:
- 调整连接器线程池大小
- 使用 NIO/NIO2 连接器替代 BIO
- 启用压缩和 HTTP/2 支持
-
高级配置:
- 自定义 Realm 实现用户认证
- 配置 JNDI 资源(数据库连接池等)
- 使用 Valve 组件扩展请求处理流程
常见面试题
-
什么是 Servlet 容器?Tomcat 与 Jetty 的区别是什么?
- Servlet 容器是实现 Servlet 规范的运行环境,负责 Servlet 的生命周期管理。
- Tomcat 更全面,支持完整的 Servlet/JSP 规范;Jetty 更轻量,适合嵌入式场景。
-
如何优化 Tomcat 性能?
- 调整连接器线程池参数(maxThreads、acceptCount)
- 使用 NIO/NIO2 连接器
- 配置 JVM 参数(堆大小、垃圾回收器)
- 启用 HTTP 压缩和缓存
-
Tomcat 的类加载机制是怎样的?
- 采用双亲委派模型,特定类加载器负责不同路径的类加载(如 Bootstrap、System、Common 等)
- Web 应用有独立的 WebappClassLoader,确保应用间隔离
-
如何在 Tomcat 中配置 HTTPS?
- 生成 SSL 证书(如使用 keytool)
- 在 server.xml 中配置 SSL 连接器
- 指定证书路径和密码
-
描述 Session 集群的工作原理。
- Tomcat 支持基于广播或组播的 Session 复制
- 所有节点保持 Session 的完整副本
- 缺点是网络开销大,可通过粘性会话或外部 Session 存储(如 Redis)优化
-
Tomcat 的 Connector 和 Container 如何协同工作?
- Connector 接收请求并封装为 Request 对象
- 将 Request 传递给 Container 处理
- Container 通过 Pipeline-Valve 机制处理请求,最终由 Servlet 生成响应
-
如何实现 Web 应用的热部署?
- 设置 Context 的 reloadable="true"(开发环境)
- 使用 Manager 应用动态部署
- 使用 Ant/Maven 等工具自动部署
-
Servlet 的生命周期是怎样的?
- init ():Servlet 初始化
- service ():处理请求
- destroy ():Servlet 销毁前调用
-
什么是 Valve 组件?
- Valve 是 Tomcat 中的过滤器组件,可在请求处理的不同阶段插入自定义逻辑(如日志记录、权限检查)
-
如何排查 Tomcat 启动缓慢的问题?
- 检查 DNS 配置
- 禁用 IPv6(如配置java.net.preferIPv4Stack=true)
- 分析线程 dump 和 GC 日志
- 检查应用初始化代码