Spring Boot 定制嵌入式 Servlet 容器详解:配置修改与容器替换实战
Spring Boot 内置了 Tomcat(默认)、Jetty、Undertow 三种主流 Servlet 容器,无需外置服务器即可通过 java -jar 直接启动应用。实际开发中,常需根据需求 “修改容器配置”(如端口、编码)或 “替换容器”(如用 Jetty 替代 Tomcat)。从 “容器配置修改(两种方式)→ 容器替换(Tomcat 转 Jetty/Undertow)→ 底层原理” 三个维度,系统讲解嵌入式 Servlet 容器的定制方法,帮你灵活掌控应用部署环境。
嵌入式 Servlet 容器简介
Spring Boot 嵌入式容器的核心价值是 “简化部署”—— 无需手动安装、配置外置服务器(如 Tomcat),应用打包为 JAR 包后可独立运行。三种内置容器的特点对比如下:
| 容器名称 | 核心特点 | 适用场景 | 默认依赖 artifactId |
|---|---|---|---|
| Tomcat | 功能全面、兼容性好、社区活跃 | 绝大多数 Web 应用(默认选择) | spring-boot-starter-tomcat |
| Jetty | 轻量级、启动快、内存占用低 | 轻量级应用、微服务(如 Spring Cloud 服务) | spring-boot-starter-jetty |
| Undertow | 高性能、异步非阻塞、支持 HTTP/2 | 高并发场景(如秒杀、API 网关) | spring-boot-starter-undertow |
默认情况下,引入 spring-boot-starter-web 会自动依赖 Tomcat 容器,无需额外配置。
修改嵌入式 Servlet 容器配置
Spring Boot 提供两种方式修改容器配置(如端口、编码、连接超时),分别适用于 “简单配置” 和 “复杂定制” 场景。
方式一:配置文件修改(推荐,简单场景)
通过 application.properties 或 application.yml 直接配置 server 前缀的属性,Spring Boot 会自动将配置映射到容器(底层通过 ServerProperties 类实现)。
1. 核心配置属性(常用)
| 配置项 | 作用描述 | 示例值 | 适用容器 |
|---|---|---|---|
server.port |
应用端口(0 表示随机端口) | 8081、0 |
所有 |
server.servlet.context-path |
应用上下文路径(默认 /) |
/demo |
所有 |
server.tomcat.uri-encoding |
Tomcat 编码格式(避免中文乱码) | UTF-8 |
Tomcat |
server.tomcat.max-threads |
Tomcat 最大线程数(控制并发能力) | 200 |
Tomcat |
server.tomcat.connection-timeout |
Tomcat 连接超时时间(毫秒) | 20000(20 秒) |
Tomcat |
server.jetty.max-http-post-size |
Jetty 最大 POST 请求大小 | 10MB |
Jetty |
server.undertow.io-threads |
Undertow IO 线程数(处理连接) | 4(默认 CPU 核心数) |
Undertow |