SpringBoot內(nèi)置服務器(Tomcat/Jetty/Undertow)切換的操作指南
用 SpringBoot 開發(fā)時,你可能從沒關(guān)注過“服務器”這件事——點一下啟動,接口就能訪問,默認用的是 Tomcat。但實際開發(fā)中,不同場景需要不同的服務器:比如追求高性能選 Undertow,追求輕量選 Jetty,兼容老項目選 Tomcat。
今天就手把手教你:SpringBoot 里怎么切換內(nèi)置服務器(Tomcat→Jetty→Undertow),以及三種服務器的核心區(qū)別、選型建議——純實操,改幾行配置就能搞定,再也不用被“默認 Tomcat”綁死。
先搞懂:SpringBoot 為啥能“內(nèi)置”服務器?
SpringBoot 之所以能一鍵啟動,核心是把 Tomcat/Jetty/Undertow 這些 Web 服務器打包成了依賴,啟動時自動初始化,不用我們手動安裝、配置。
核心邏輯:
spring-boot-starter-web
- 依賴默認引入
spring-boot-starter-tomcat(內(nèi)置 Tomcat); - 切換服務器的本質(zhì):排除默認的 Tomcat 依賴,引入目標服務器的 Starter 依賴;
- 所有服務器都適配 SpringBoot 的
WebServer接口,切換后代碼無需任何改動。
先看三款內(nèi)置服務器的核心差異(新手先記結(jié)論):
| 特性 | Tomcat(默認) | Jetty | Undertow |
|---|---|---|---|
| 核心優(yōu)勢 | 生態(tài)完善、兼容性好、文檔多 | 輕量、啟動快、適合長連接(WebSocket) | 高性能、低內(nèi)存、并發(fā)能力強 |
| 核心劣勢 | 內(nèi)存占用較高、并發(fā)性能一般 | 并發(fā)性能弱于 Undertow | 功能比 Tomcat 少、文檔相對少 |
| 適用場景 | 通用場景、傳統(tǒng) Web 項目、新手 | 輕量應用、WebSocket 應用(如聊天) | 高并發(fā)接口、微服務、性能敏感場景 |
| 內(nèi)存占用(同等配置) | 高 | 中 | 低 |
| 并發(fā)處理能力 | 中 | 中低 | 高 |
默認服務器——Tomcat
SpringBoot 項目只要引入 spring-boot-starter-web,就自動用 Tomcat 作為內(nèi)置服務器:
<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 配置(比如調(diào)線程數(shù)、最大連接數(shù)),在 application.yml 里加:
server: tomcat: max-threads:200# 最大工作線程數(shù)(默認200) min-spare-threads:20# 最小空閑線程數(shù) max-connections:10000# 最大連接數(shù) 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 相關(guān)輸出,說明切換成功:
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 里調(diào)整 Jetty 參數(shù):
server: jetty: acceptors:4# 接受連接的線程數(shù)(默認CPU核心數(shù)) selectors:8# 處理IO的線程數(shù) max-http-post-size: 10MB # 最大POST請求大小
切換到 Undertow
Undertow 是 RedHat 開源的服務器,性能吊打 Tomcat/Jetty,內(nèi)存占用最低,適合高并發(fā)的微服務接口。
第一步:排除 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>
第二步:啟動驗證,查看日志
啟動日志里出現(xiàn) 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 配置(性能調(diào)優(yōu))
Undertow 的性能調(diào)優(yōu)主要在線程數(shù)和連接數(shù),配置 application.yml:
server:
undertow:
# IO 線程數(shù)(默認CPU核心數(shù)*2),處理連接接受、請求分發(fā)
io-threads:8
# 工作線程數(shù)(默認IO線程數(shù)*8),處理具體的業(yè)務請求
worker-threads:64
# 最大請求大小
max-http-post-size: 10MB
# 開啟HTTP2(可選,需要HTTPS)
http2:
enabled:true調(diào)優(yōu)建議:IO 線程數(shù)設(shè)為 CPU 核心數(shù)2,工作線程數(shù)設(shè)為 IO 線程數(shù)8~16,根據(jù)服務器配置調(diào)整。
必避的 3 個坑
只引入新服務器依賴,沒排除 Tomcat:
結(jié)果:項目啟動報錯(依賴沖突),日志里同時出現(xiàn) Tomcat 和 Jetty/Undertow;
解決:必須先排除 spring-boot-starter-tomcat,再引入目標服務器依賴。
切換后接口訪問 404:
原因:服務器切換不影響業(yè)務代碼,大概率是其他配置問題(比如端口錯、Controller 沒掃描到);
解決:檢查 server.port、主啟動類包層級、@RestController 注解是否正確。
Undertow 開啟 HTTP2 但沒配 HTTPS:
結(jié)果:啟動報錯,HTTP2 必須基于 HTTPS;
解決:要么關(guān)閉 HTTP2,要么配置 SSL 證書(生產(chǎn)環(huán)境再配)。
生產(chǎn)環(huán)境選型建議(按場景選)
不用盲目追求“高性能”,按實際需求選:
新手/通用場景:選 Tomcat(文檔多、問題好排查、兼容性最好);
WebSocket 應用(聊天、推送):選 Jetty(對長連接支持更優(yōu));
高并發(fā)微服務接口:選 Undertow(性能最高、內(nèi)存占用最低);
老項目遷移:選 Tomcat(和傳統(tǒng) Web 項目兼容最好);
容器化部署(Docker/K8s):選 Undertow(鏡像體積更小,資源占用低)。
最后說兩句
SpringBoot 切換內(nèi)置服務器的核心就兩步:
- 排除默認的 Tomcat 依賴;
- 引入目標服務器(Jetty/Undertow)的 Starter 依賴。
三款服務器沒有“最好”,只有“最適合”——大部分場景用 Tomcat 足夠,追求性能選 Undertow,追求輕量選 Jetty。
以上就是SpringBoot內(nèi)置服務器(Tomcat/Jetty/Undertow)切換的操作指南的詳細內(nèi)容,更多關(guān)于SpringBoot內(nèi)置服務器切換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java byte與base64的互轉(zhuǎn)的實現(xiàn)示例
在項目開發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-02-02
Springboot結(jié)合rabbitmq實現(xiàn)的死信隊列
為了保證訂單業(yè)務的消息數(shù)據(jù)不丟失,需要使用到RabbitMQ的死信隊列機制,本文主要介紹了Springboot結(jié)合rabbitmq實現(xiàn)的死信隊列,具有一定的參考價值,感興趣的可以了解一下2023-09-09
maven為MANIFEST.MF文件添加內(nèi)容的方法
這篇文章主要介紹了maven為MANIFEST.MF文件添加內(nèi)容的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片
這篇文章主要為大家詳細介紹了java實現(xiàn)圖片轉(zhuǎn)base64字符串,java實現(xiàn)base64字符串轉(zhuǎn)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02

