不只有Tomcat,还有Undertow

85 阅读2分钟

在 Spring Boot 中,默认内置了多种 Web 服务器,常见的有 TomcatUndertow 和 Jetty。以下是 Tomcat 和 Undertow 的详细对比:


1. 概述

特性TomcatUndertow
定位成熟稳定的 Servlet 容器,广泛使用。高性能、轻量级的 Web 服务器,基于 NIO。
性能性能较好,适合大多数场景。性能优越,资源消耗低,适合高并发场景。
功能功能丰富,支持完整的 Java EE 规范。功能简洁,专注于高性能和低资源消耗。
适用场景传统 Web 应用,需要稳定性和兼容性的场景。高性能、高并发的场景,如微服务、API 网关等。

2. 性能对比

特性TomcatUndertow
性能性能较好,适合大多数场景。性能优越,资源消耗低,适合高并发场景。
资源消耗内存和 CPU 占用较高。内存和 CPU 占用低,适合资源受限的环境。
并发处理能力基于传统的阻塞 I/O 模型,并发处理能力有限。基于 NIO 的非阻塞模型,支持高并发连接。

3. 功能对比

特性TomcatUndertow
Servlet 支持支持完整的 Servlet 规范(Servlet、JSP 等)。支持 Servlet 4.0 规范,但不支持 JSP。
WebSocket 支持支持 WebSocket。支持 WebSocket,性能更好。
HTTP/2 支持支持 HTTP/2。支持 HTTP/2,性能更好。
扩展性功能丰富,插件和扩展较多。功能简洁,扩展性较弱。

4. 配置对比

Tomcat 配置示例

server:
  port: 8080
  tomcat:
    max-threads: 200
    min-spare-threads: 10
    max-connections: 10000
    connection-timeout: 5000

Undertow 配置示例

server:
  port: 8080
  undertow:
    worker-threads: 100
    io-threads: 4
    buffer-size: 1024
    direct-buffers: true

5. 适用场景

Tomcat

  • 传统 Web 应用,需要稳定性和兼容性。
  • 需要支持完整的 Java EE 规范(如 JSP)。
  • Spring Boot 默认的 Web 服务器。

Undertow

  • 高性能、高并发的场景,如微服务、API 网关等。
  • 资源受限的环境,需要低内存和 CPU 占用。
  • 需要更好的 WebSocket 和 HTTP/2 支持。

6. 如何切换 Web 服务器

切换为 Undertow

在 pom.xml 中排除 Tomcat 并引入 Undertow:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

切换回 Tomcat

如果当前使用的是 Undertow,可以排除 Undertow 并引入 Tomcat:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

7. 总结

特性TomcatUndertow
性能较好优越
资源消耗较高
功能丰富简洁
适用场景传统 Web 应用高性能、高并发场景
  • 如果需要稳定性和兼容性,推荐使用 Tomcat
  • 如果需要高性能和低资源消耗,推荐使用 Undertow