SpringBoot内置服务器(Tomcat/Jetty/Undertow)切换的操作指南

 更新时间:2026年03月25日 08:51:19   作者:希望永不加班  
本文介绍了如何在SpringBoot中切换内置服务器(Tomcat、Jetty和Undertow),分析了它们的核心差异和适用场景,通过修改pom.xml和application.yml文件,可以实现服务器的切换和自定义配置,最后给出了选型建议和注意事项,需要的朋友可以参考下

用 SpringBoot 开发时,你可能从没关注过“服务器”这件事——点一下启动,接口就能访问,默认用的是 Tomcat。但实际开发中,不同场景需要不同的服务器:比如追求高性能选 Undertow,追求轻量选 Jetty,兼容老项目选 Tomcat。

今天就手把手教你:SpringBoot 里怎么切换内置服务器(Tomcat→Jetty→Undertow),以及三种服务器的核心区别、选型建议——纯实操,改几行配置就能搞定,再也不用被“默认 Tomcat”绑死。

先搞懂:SpringBoot 为啥能“内置”服务器?

SpringBoot 之所以能一键启动,核心是把 Tomcat/Jetty/Undertow 这些 Web 服务器打包成了依赖,启动时自动初始化,不用我们手动安装、配置。

核心逻辑:

spring-boot-starter-web
  •  依赖默认引入 spring-boot-starter-tomcat(内置 Tomcat);
  • 切换服务器的本质:排除默认的 Tomcat 依赖,引入目标服务器的 Starter 依赖;
  • 所有服务器都适配 SpringBoot 的 WebServer 接口,切换后代码无需任何改动。

先看三款内置服务器的核心差异(新手先记结论):

特性Tomcat(默认)JettyUndertow
核心优势生态完善、兼容性好、文档多轻量、启动快、适合长连接(WebSocket)高性能、低内存、并发能力强
核心劣势内存占用较高、并发性能一般并发性能弱于 Undertow功能比 Tomcat 少、文档相对少
适用场景通用场景、传统 Web 项目、新手轻量应用、WebSocket 应用(如聊天)高并发接口、微服务、性能敏感场景
内存占用(同等配置)
并发处理能力中低

默认服务器——Tomcat

SpringBoot 项目只要引入 spring-boot-starter-web,就自动用 Tomcat 作为内置服务器:

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<dependency>

启动项目,日志里会看到 Tomcat 启动的痕迹:

2026-03-19 10:00:00.000  INFO 12345 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2026-03-19 10:00:00.123  INFO 12345 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http)

如果想自定义 Tomcat 配置(比如调线程数、最大连接数),在 application.yml 里加:

server:
tomcat:
max-threads:200# 最大工作线程数(默认200)
min-spare-threads:20# 最小空闲线程数
max-connections:10000# 最大连接数
accept-count:100# 连接队列长度(满了之后新请求会被拒绝)

切换到 Jetty

Jetty 比 Tomcat 更轻量,启动更快,对 WebSocket 支持更友好(比如做即时聊天、消息推送项目)。

第一步:排除 Tomcat 依赖,引入 Jetty 依赖

修改 pom.xml,核心是“先排除、再引入”:

<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<exclusion>
<exclusions>
<dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jettyartifactId>
<dependency>
<dependencies>

第二步:启动项目,验证切换成功

启动日志里会看到 Jetty 相关输出,说明切换成功:

2026-03-19 10:01:00.000  INFO 67890 --- [           main] o.e.j.s.Server                          : jetty-11.0.18; built: 2024-01-01T00:00:00Z; git: abc123; jvm 17.0.10
2026-03-19 10:01:00.123  INFO 67890 --- [           main] o.e.j.w.StandardDescriptorProcessor     : NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2026-03-19 10:01:00.456  INFO 67890 --- [           main] o.s.b.web.embedded.jetty.JettyWebServer  : Jetty started on port 8080 (http) with context path '/'

第三步:自定义 Jetty 配置(可选)

在 application.yml 里调整 Jetty 参数:

server:
jetty:
acceptors:4# 接受连接的线程数(默认CPU核心数)
selectors:8# 处理IO的线程数
max-http-post-size: 10MB  # 最大POST请求大小

切换到 Undertow

Undertow 是 RedHat 开源的服务器,性能吊打 Tomcat/Jetty,内存占用最低,适合高并发的微服务接口。

第一步:排除 Tomcat 依赖,引入 Undertow 依赖

同样修改 pom.xml

<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<exclusion>
<exclusions>
<dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-undertowartifactId>
<dependency>
<dependencies>

第二步:启动验证,查看日志

启动日志里出现 Undertow 标识,说明切换成功:

2026-03-19 10:02:00.000  INFO 11223 --- [           main] io.undertow.servlet.core.ApplicationDeploymentManager : starting deployment of web application directory /tmp/tomcat.12345/webapps/ROOT
2026-03-19 10:02:00.345  INFO 11223 --- [           main] o.s.b.web.embedded.undertow.UndertowWebServer  : Undertow started on port 8080 (http) with context path '/'

第三步:自定义 Undertow 配置(性能调优)

Undertow 的性能调优主要在线程数和连接数,配置 application.yml

server:
undertow:
# IO 线程数(默认CPU核心数*2),处理连接接受、请求分发
io-threads:8
# 工作线程数(默认IO线程数*8),处理具体的业务请求
worker-threads:64
# 最大请求大小
max-http-post-size: 10MB
# 开启HTTP2(可选,需要HTTPS)
    http2:
enabled:true

调优建议:IO 线程数设为 CPU 核心数2,工作线程数设为 IO 线程数8~16,根据服务器配置调整。

必避的 3 个坑

只引入新服务器依赖,没排除 Tomcat
结果:项目启动报错(依赖冲突),日志里同时出现 Tomcat 和 Jetty/Undertow;
解决:必须先排除 spring-boot-starter-tomcat,再引入目标服务器依赖。

切换后接口访问 404
原因:服务器切换不影响业务代码,大概率是其他配置问题(比如端口错、Controller 没扫描到);
解决:检查 server.port、主启动类包层级、@RestController 注解是否正确。

Undertow 开启 HTTP2 但没配 HTTPS
结果:启动报错,HTTP2 必须基于 HTTPS;
解决:要么关闭 HTTP2,要么配置 SSL 证书(生产环境再配)。

生产环境选型建议(按场景选)

不用盲目追求“高性能”,按实际需求选:

新手/通用场景:选 Tomcat(文档多、问题好排查、兼容性最好);

WebSocket 应用(聊天、推送):选 Jetty(对长连接支持更优);

高并发微服务接口:选 Undertow(性能最高、内存占用最低);

老项目迁移:选 Tomcat(和传统 Web 项目兼容最好);

容器化部署(Docker/K8s):选 Undertow(镜像体积更小,资源占用低)。

最后说两句

SpringBoot 切换内置服务器的核心就两步:

  • 排除默认的 Tomcat 依赖;
  • 引入目标服务器(Jetty/Undertow)的 Starter 依赖。

三款服务器没有“最好”,只有“最适合”——大部分场景用 Tomcat 足够,追求性能选 Undertow,追求轻量选 Jetty。

以上就是SpringBoot内置服务器(Tomcat/Jetty/Undertow)切换的操作指南的详细内容,更多关于SpringBoot内置服务器切换的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Java实现Redis多级缓存方案

    基于Java实现Redis多级缓存方案

    这篇文章主要介绍了Redis多级缓存方案分享,传统缓存方案、多级缓存方案、JVM本地缓存,举例说明这些方案,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-03-03
  • apschedule的定时任务实例(python)

    apschedule的定时任务实例(python)

    文章介绍了四种配置定时任务的方法,包括直接代码配置、YAML配置文件管理、装饰器方式自动注册任务以及关闭定时任务的方法
    2026-01-01
  • java并发包JUC诞生及详细内容

    java并发包JUC诞生及详细内容

    这篇文章主要为大家介绍了java并发包JUC的诞生及JUC增加的内容详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Java 将List中的实体类按照某个字段进行分组并存放至Map中操作

    Java 将List中的实体类按照某个字段进行分组并存放至Map中操作

    这篇文章主要介绍了Java 将List中的实体类按照某个字段进行分组并存放至Map中操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • hibernate中HQL如何调用自定义函数

    hibernate中HQL如何调用自定义函数

    这篇文章主要介绍了hibernate中HQL如何调用自定义函数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • JVM:你知道为什么对象一定在堆中分配吗

    JVM:你知道为什么对象一定在堆中分配吗

    这篇文章主要介绍了jvm对象的创建和分配的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-08-08
  • JSON中fastjson、jackson、gson如何选择

    JSON中fastjson、jackson、gson如何选择

    在Java中,JSON的解析方式很多,例如fastjson(阿里)、Gson(谷歌)、jackjson等,本文主要介绍了JSON中fastjson、jackson、gson如何选择,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Spring boot集成Kafka+Storm的示例代码

    Spring boot集成Kafka+Storm的示例代码

    这篇文章主要介绍了Spring boot集成Kafka+Storm的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java实现快速幂算法详解

    Java实现快速幂算法详解

    快速幂是用来解决求幂运算的高效方式。此算法偶尔会出现在笔试以及面试中,特意花时间研究了下这题,感兴趣的小伙伴快跟随小编一起学习一下
    2022-10-10
  • Java的Channel通道之FileChannel类详解

    Java的Channel通道之FileChannel类详解

    这篇文章主要介绍了Java的Channel通道之FileChannel类详解,FileChannel类是Java NIO中的一个重要类,用于在文件中进行读写操作,它提供了一种高效的方式来处理大文件和随机访问文件的需求,需要的朋友可以参考下
    2023-10-10

最新评论