基于本文回答
0
评论

Spring Boot 支持哪些主流的内嵌 Servlet 容器?

知识点图片

Spring Boot 主要支持以下 3 种 主流的内嵌 Servlet 容器(用于传统的 Spring MVC 阻塞式应用):

  1. Apache Tomcat (默认)
  2. Eclipse Jetty
  3. Undertow

此外,如果你使用的是 Spring WebFlux(响应式编程),默认使用的是 Netty(虽然 Netty 本质上是异步事件驱动的网络框架,不完全等同于传统的 Servlet 容器,但在 Spring Boot 中扮演同样的角色)。

以下是这三种主流 Servlet 容器的详细对比和特点:

1. Apache Tomcat (默认容器)

  • 来源:Apache 软件基金会。
  • 特点
    • 默认选择:Spring Boot spring-boot-starter-web 默认包含的就是 Tomcat。
    • 成熟稳定:市场占有率最高,文档最丰富,社区最活跃。
    • 通用性强:对 Servlet 标准的支持非常完善。
  • 适用场景:绝大多数标准的 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
右滑查看面试常问