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实现多人聊天室可视化

    java实现多人聊天室可视化

    这篇文章主要为大家详细介绍了java实现多人聊天室可视化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java详细解析下拉菜单和弹出菜单的使用

    Java详细解析下拉菜单和弹出菜单的使用

    这篇文章主要介绍了怎么用Java来创建和使用下拉菜单和弹出菜单,下拉菜单和弹出菜单是我们经常要用的工具,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • java byte与base64的互转的实现示例

    java byte与base64的互转的实现示例

    在项目开发中经常用到,比如前端上送文件流(byte[])到后台并转成文件,本文主要介绍了java byte与base64的互转的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Springboot结合rabbitmq实现的死信队列

    Springboot结合rabbitmq实现的死信队列

    为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,本文主要介绍了Springboot结合rabbitmq实现的死信队列,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • JAVA保证HashMap线程安全的几种方式

    JAVA保证HashMap线程安全的几种方式

    HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAVA保证HashMap线程安全的几种方式,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • java 多线程的几种实现方法总结

    java 多线程的几种实现方法总结

    这篇文章主要介绍了java 多线程的几种实现方法总结的相关资料,希望通过本文能帮助到大家,让大家掌握java多线程的知识,需要的朋友可以参考下
    2017-10-10
  • maven为MANIFEST.MF文件添加内容的方法

    maven为MANIFEST.MF文件添加内容的方法

    这篇文章主要介绍了maven为MANIFEST.MF文件添加内容的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java有界类型参数的实例用法

    java有界类型参数的实例用法

    小编给大家整理了一篇关于java有界类型参数的使用的相关文章及扩展实例内容,有需要的朋友们可以学习参考下。
    2021-07-07
  • java使用spring实现读写分离的示例代码

    java使用spring实现读写分离的示例代码

    本篇文章主要介绍了java使用spring实现读写分离的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • java实现图片转base64字符串 java实现base64字符串转图片

    java实现图片转base64字符串 java实现base64字符串转图片

    这篇文章主要为大家详细介绍了java实现图片转base64字符串,java实现base64字符串转图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论