Tomcat
2025/5/28大约 4 分钟
Tomcat 是什么?作用是什么?
- Tomcat 是 Java 的 Servlet 容器,负责运行 JSP、Servlet、Spring MVC 等 Web 应用。
- 实现了 Servlet 规范、JSP 规范,是 Java Web 的默认运行容器。
- 常用于中小型业务场景,轻量、稳定、开源。
Tomcat 架构核心组件有哪些?
- Connector(连接器):负责网络通信,接收请求并返回响应。
- Container(容器):负责处理请求,运行 Servlet(Engine → Host → Context → Wrapper)。
- Executor(线程池):管理 Tomcat 的线程资源。
- ClassLoader:支持应用隔离加载。
- Lifecycle:统一生命周期管理机制。
Tomcat 是如何处理一次请求的?
- Connector 接收 Socket 请求(默认使用 NIO)。
- 解析 HTTP 请求并封装成
HttpRequest。 - 将请求交给 Engine → Host → Context → Wrapper 精准定位目标 Servlet。
- Servlet.service() 执行业务逻辑。
- 返回 Response,通过 Connector 写回浏览器。
Tomcat 使用哪种线程模型?
NIO(默认):基于 Selector,支持高并发
[?]BIO:传统阻塞式,性能差
[?]APR:基于本地库,高性能、接近 Nginx,但部署成本高
[?]现代生产通常使用 NIO/NIO2。
Tomcat 的常见配置项有哪些?
- port:监听端口
- protocol:协议(
org.apache.coyote.http11.Http11NioProtocol最常用) - maxConnections:最大连接数
- maxThreads:最大工作线程数(默认 200)
- acceptCount:拒绝前的等待队列长度
- connectionTimeout:连接超时
为什么 Spring Boot 内嵌 Tomcat?
- 免安装、免部署,开箱即用
- 可通过 Maven/Gradle 管理版本
- 更好的自动化运维:jar 一条命令即可运行
- 更容易容器化(Docker)
Tomcat 如何隔离不同 Web 应用的类?
使用 一套分级 ClassLoader:
- BootstrapClassLoader(JDK 类)
- CommonClassLoader(共享类)
- WebAppClassLoader(应用私有类)
不同应用之间 classpath 隔离,相互不影响。
Tomcat 和 Nginx 的区别?
Tomcat:应用服务器
- 能执行 Servlet / Java 代码
- 属于动态应用容器
Nginx:高性能反向代理服务器
- 负载均衡、静态文件、SSL终端
- 不执行 Java 代码
大部分架构使用 Nginx → Tomcat。
如何提升 Tomcat 性能?
- 将 I/O 协议改为 NIO / NIO2。
- 调整线程池:maxThreads、minSpareThreads、acceptCount。
- 配合 Nginx 做反向代理与静态资源处理。
- 配置 Gzip 压缩 减少数据传输量。
- 减少单实例部署的 Web 应用数量。
- 禁用不必要的 JSP/Session 功能。
Tomcat 默认端口是多少?怎么修改?
回答:
默认是 8080,在 conf/server.xml 中修改 <Connector port="8080"> 即可。
Tomcat 如何实现多线程?
回答:
使用线程池(Executor),每个请求由线程池中线程处理,提升并发性能。
Tomcat 如何解析 web.xml?
回答:
启动时解析 WEB-INF/web.xml,注册 Servlet、Filter、Listener,并按配置初始化加载。
Tomcat 如何热部署应用?
回答:
监听 webapps 目录变化,自动部署 .war 或解压目录,可实现热部署(支持关闭)。
Tomcat 如何处理静态资源?
回答:
由默认的 DefaultServlet 处理,如 HTML、CSS、JS 等静态文件。
Tomcat 是线程安全的吗?
回答:
Tomcat 本身线程安全,但开发者需保证自己写的 Servlet 是线程安全的(避免共享可变状态)。