Spring Boot 支持哪些主流的内嵌 Servlet 容器?
Spring Boot 主要支持以下 3 种 主流的内嵌 Servlet 容器(用于传统的 Spring MVC 阻塞式应用):
- Apache Tomcat (默认)
- Eclipse Jetty
- Undertow
此外,如果你使用的是 Spring WebFlux(响应式编程),默认使用的是 Netty(虽然 Netty 本质上是异步事件驱动的网络框架,不完全等同于传统的 Servlet 容器,但在 Spring Boot 中扮演同样的角色)。
以下是这三种主流 Servlet 容器的详细对比和特点:
1. Apache Tomcat (默认容器)
- 来源:Apache 软件基金会。
- 特点:
- 默认选择:Spring Boot
spring-boot-starter-web默认包含的就是 Tomcat。 - 成熟稳定:市场占有率最高,文档最丰富,社区最活跃。
- 通用性强:对 Servlet 标准的支持非常完善。
- 默认选择:Spring Boot
- 适用场景:绝大多数标准的 Web 应用,如果你没有特殊需求,直接使用默认的 Tomcat 即可。
2. Eclipse Jetty
- 来源:Eclipse 基金会。
- 特点:
- 轻量级:架构简单,启动速度快,内存占用相对较小。
- 长连接优化:在处理大量长连接(如 WebSocket、聊天室应用)时表现优秀。
- 灵活:非常容易定制和嵌入。
- 适用场景:需要处理大量 WebSocket 连接的应用,或者对启动速度和内存有严格限制的 IoT(物联网)环境。
3. Undertow
- 来源:JBoss (Red Hat)。
- 特点:
- 高性能:基于 NIO (非阻塞 I/O),在高并发场景下吞吐量通常优于 Tomcat 和 Jetty。
- 低内存:内存占用非常低。
- 不支持 JSP:默认不支持 JSP(虽然现在 JSP 用得也少了,但这算是一个限制)。
- 适用场景:高并发、高吞吐量的非阻塞业务场景(如微服务网关、高频 API 服务)。
如何切换容器?
在 Spring Boot 中切换容器非常简单,只需要在构建工具(Maven 或 Gradle)中排除默认的 Tomcat 依赖,并添加新的容器依赖即可。
以 Maven 为例,切换到 Undertow 的配置如下:
xml
<dependencies>
<!-- 引入 Web 模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 1. 排除默认的 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 2. 添加 Undertow 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
总结建议
- 求稳:用 Tomcat(默认,无需配置)。
- 追求高并发/高性能:推荐尝试 Undertow。
- 长连接/资源受限:考虑 Jetty。