SpringBoot切換 Servlet 容器為Undertow

題目詳細答案

Spring Boot 默認使用 Tomcat 作為嵌入式的 Servlet 容器,但你也可以切換到 Undertow。Undertow 是一個輕量級、高性能的 Web 服務器和 Servlet 容器。

步驟 1:排除 Tomcat 依賴

需要在pom.xml文件(如果使用的是 Maven)或build.gradle文件(如果使用的是 Gradle)中排除 Tomcat 依賴。

Maven:
<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>
Gradle:
implementation('org.springframework.boot:spring-boot-starter-web') {exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}

步驟 2:添加 Undertow 依賴

添加 Undertow 依賴。

Maven:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

步驟 3:確認配置

確保你的 Spring Boot 應用程序的主類沒有特定于 Tomcat 的配置。通常情況不需要做任何修改,因為 Spring Boot 會自動配置 Undertow。

示例pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>11</java.version></properties><dependencies><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

驗證

啟動Spring Boot 應用程序。應該能夠在控制臺日志中看到 Undertow 服務器啟動的消息,而不是 Tomcat。

2021-08-30 10:00:00.000 INFO 12345 --- [ main] io.undertow : starting undertow server

Spring Boot 切換默認 Servlet 容器到 Undertow 的詳細指南

為什么選擇 Undertow?

Undertow 是一個由 Red Hat 開發的輕量級、高性能的 Web 服務器和 Servlet 容器,相比 Tomcat 有以下優勢:

  • 更輕量級,內存占用更少
  • 更高的性能,特別是在高并發場景下
  • 支持 HTTP/2
  • 靈活的架構設計

詳細切換步驟

1. 排除 Tomcat 依賴

Maven 項目 (pom.xml):

<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>

Gradle 項目 (build.gradle):

implementation('org.springframework.boot:spring-boot-starter-web') {exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}

2. 添加 Undertow 依賴

Maven 項目 (pom.xml):

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

Gradle 項目 (build.gradle):

implementation 'org.springframework.boot:spring-boot-starter-undertow'

3. 完整 Maven 配置示例

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version> <!-- 或使用最新版本 --></parent><properties><java.version>11</java.version></properties><dependencies><!-- Web starter with Tomcat excluded --><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><!-- Undertow starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency><!-- Test dependencies --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

4. 自定義 Undertow 配置 (可選)

application.propertiesapplication.yml 中可以配置 Undertow 參數:

application.properties:

# 服務器端口
server.port=8080# Undertow 特定配置
server.undertow.threads.io=16
server.undertow.threads.worker=256
server.undertow.buffer-size=1024
server.undertow.direct-buffers=true

application.yml:

server:port: 8080undertow:threads:io: 16worker: 256buffer-size: 1024direct-buffers: true

5. 驗證切換成功

啟動應用程序后,在控制臺日志中應該能看到類似以下信息,表明 Undertow 已成功啟動:

2023-08-11 14:30:00.000 INFO 12345 --- [ main] o.s.b.web.embedded.undertow.Undertow : Undertow started on port(s) 8080 (http)

而不是 Tomcat 的啟動日志。

常見問題解決

  1. 端口沖突:
    • 確保沒有其他應用程序占用相同端口
    • application.properties 中修改 server.port
  1. 依賴沖突:
    • 確保完全排除了 Tomcat 依賴
    • 使用 mvn dependency:tree 檢查依賴關系
  1. 性能調優:
    • 根據應用負載調整線程池大小
    • 監控應用性能指標進行優化

總結

通過以上步驟,你可以輕松將 Spring Boot 的默認 Servlet 容器從 Tomcat 切換到 Undertow。Undertow 特別適合需要高性能和低內存占用的應用場景。切換后,大部分 Spring Boot 的功能和配置方式保持不變,確保了良好的開發體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93028.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過限制對象的內存分配位置來實現特定的設計目標

《More Effective C》中的條款27聚焦于如何通過語言特性強制或禁止對象在堆上分配&#xff0c;其核心目標是通過控制內存分配位置來提升代碼的安全性、可維護性和資源管理效率。 個人覺得&#xff0c;這個條款看看就可以了&#xff0c;可能在個別情況下需要考慮條款中說的情況。…

廣東省省考備考(第七十四天8.12)——資料分析、數量關系(40%-70%正確率的題目)

資料分析 錯題解析解析今日題目正確率&#xff1a;87% 數量關系&#xff1a;數學運算 錯題解析解析備注&#xff1a; ①本題所求保護罩的表面積不包含底面。因為通常所說的“罩子”是沒有底面的&#xff0c;即使罩子有底面&#xff0c;往往底面材質和罩子材質也不一樣&#xff…

Java多源AI接口融合框架:動態模型切換與智能路由實戰

> 在電商客服場景中,用戶的一句“這件衣服適合夏天穿嗎?”需要同時調用服飾知識庫、天氣API和風格推薦模型,但當GPT-4響應延遲時能否無縫降級到Claude?在預算有限時能否自動選擇成本更低的本地模型? **多源AI接口整合已成為企業智能化落地的新基建**。據Gartner 2025報…

Linux中Docker redis介紹以及應用

一、NoSQL 1.1 單機mysql的美好時代 在90年代&#xff0c;一個網站的訪問量一般都不大&#xff0c;用單個數據庫完全可以輕松應付。 那個時候&#xff0c;更多的是靜態網頁&#xff0c;動態交互類型的網站不多。 上述架構上&#xff0c;我們來看看數據存儲的瓶頸是什么&…

鍋氣:「現炒之魂·煙火人間」

《現炒之魂煙火人間》高清4K寫實攝影方案高清4K寫實攝影方案描述&#xff0c;可直接作為AI繪畫工具&#xff08;如MidJourney/DALLE&#xff09;的提示詞使用&#xff1a;&#x1f31f; 核心概念? 主題&#xff1a;中式爆炒瞬間的生命力爆發? 氛圍&#xff1a;熾烈煙火氣 神…

【力扣494】目標和

用子集法&#xff0c;選or不選變成了正or負&#xff0c;BFS執行所有情況&#xff0c;判斷恰好為目標和。 靈神&#xff1a; 設所有數的和為s&#xff0c;取正的和為p&#xff0c;則和為p-(s-p)&#xff1b; 有t p-(s-p) 2p-s&#xff0c;即p (st)/2&#xff1b;這里的s和t都…

零基礎AI編程開發微信小程序賺流量主廣告實戰

目錄 前言&#xff1a;為什么選微信小程序流量主&#xff1f;零基礎也能搞定的開發流程AI編程助手怎么幫忙&#xff1f;實戰案例&#xff1a;做個AI圖片識別小程序流量主廣告怎么接入和變現&#xff1f;常見問題與避坑指南經驗總結與互動1. 前言&#xff1a;為什么選微信小程序…

第六十三章:AI模型的“跨界之旅”:不同硬件架構下的兼容性方案

不同硬件架構兼容前言&#xff1a;AI的“英雄”與“舞臺”第一章&#xff1a;AI硬件生態總覽&#xff1a;百花齊放的“算力戰場”1.1 CPU&#xff1a;AI計算的“全能基石”1.2 GPU&#xff1a;AI計算的“核心加速器”1.3 專用AI芯片&#xff1a;NPU/TPU等“定制利器”第二章&am…

2 Abp 框架核心架構

ABP Framework 核心架構 架構概述 ABP Framework 基于模塊化、分層架構構建&#xff0c;遵循領域驅動設計&#xff08;DDD&#xff09;、依賴注入和 SOLID 原則&#xff0c;為構建可維護、可測試和可擴展的應用程序提供基礎。 核心模塊 #mermaid-svg-10g1JRKDltZN4z5P {font-fa…

Spring的高頻基礎面試題(二)

1. 線程池創建的作用是什么 ? 線程池的核心參數有哪些 ? 線程池執行任務的流程 ?作用&#xff1a;提高線程的復用性&#xff0c;降低損耗資源。核心參數&#xff1a;核心線程 、最大線程數 、等待空閑時間、時間單位、任務隊列、線程工廠、拒絕策略執行流程&#xff1a; 首…

【JavaEE】(12) 創建一個 Sring Boot 項目

一、Maven 1、什么是 Maven Maven 用于管理項目、管理依賴&#xff08;通過 POM 文件配置各種各樣的 jar 包&#xff09;。 在沒有 Maven 之前&#xff0c;需要手動將 jar 包導入項目。整個流程&#xff1a;從網上查 jar 包并下載到本地&#xff08;或者叫同事發&#xff09;&…

最終章【1】Epson機器人篇

1,開發環境 Epson RC 7.5.1 RC90控制器 2,條件分支指令 2.1,If...EndIf,邏輯判斷分支 語法格式: If 條件1 Then 處理邏輯1................ ElseIf 條件2 Then 處理邏輯2................ Else 處理邏輯3................ EndIf 例子: String order$If ord…

vue3 實現web網頁不同分辨率適配

vue3 實現web網頁不同分辨率適配首先這個標題可能不是特別的合適&#xff0c;之前開發了一個網站&#xff0c;那個網站是類似于官網的效果&#xff0c;按照 19201080100% 的分辨率進行開發的&#xff0c;但是在開發完成之后&#xff0c;發現有的電腦是 19201080125% 的大小展示…

電子電路原理學習筆記---第5章特殊用途二極管---第2天

5.5閱讀數據手冊圖5-15給出了1N957B和1N4728A系列的齊納二極管數據手冊中的數據&#xff0c;再后面的討論中將參考這些數據。數據手冊中大部分信息是提供給電路設計者的&#xff0c;但有些內容在故障診斷和測試時也有必要了解。5.5.1最大功率齊納二極管的功率等于它對應的電壓與…

實現一個二維碼讓 iOS 和 Android 用戶自動跳轉到對應下載鏈接

實現一個二維碼讓 iOS 和 Android 用戶自動跳轉到對應下載鏈接 背景 開發一個APP后&#xff0c;需要分發Android測試包和iOS TestFlight的場景&#xff0c;但為兩個端分別生成二維碼&#xff0c;需要為二維碼標識系統以免導致用戶掃錯碼。如何實現一個二維碼讓 iOS 和 Androi…

Docker中ES安裝分詞器

1、下載好的文件上傳到虛擬機或者云服務器 https://release.infinilabs.com/analysis-ik/stable/ elasticsearch-analysis-ik-8.10.4.zip 2、將本地 ZIP 文件復制到容器內的臨時目錄&#xff08;如 /tmp/&#xff09; docker cp /data/elasticsearch-analysis-ik-8.10.4.zip e…

掌握while循環:C語言編程基礎

目錄 一、while循環簡介 二、if和while的對比 語法結構對比&#xff1a; 實際代碼對比&#xff1a; 三、while語句的執行流程 while循環的執行流程如下&#xff1a; 流程圖表示&#xff1a; 四、while循環實踐 練習&#xff1a;在屏幕上打印1~10的值 五、進階練習 題…

XML Schemas 簡介

XML Schemas 簡介 引言 XML(可擴展標記語言)是互聯網上用于數據交換的一種標準標記語言。隨著互聯網技術的飛速發展,XML因其靈活性和可擴展性而被廣泛應用于各種領域。XML Schemas(XML模式)作為一種定義XML文檔結構的機制,為XML文檔提供了嚴格的規范,確保了數據的準確…

Gradle(二)Gradle的優勢、項目結構介紹

目錄一、什么是 Gradle&#xff1f;二、為什么選擇 Gradle&#xff1f;三、Gradle 的項目結構3.1 項目結構3.2 gradle wrapper 包裝器3.3 settings.gradle 設置文件3.4 build.gradle 核心構建文件1&#xff09;原始文件內容2&#xff09;plugins 插件3&#xff09;repositories…

機器學習-決策樹(上)

決策樹構建&#xff1a; 決策樹的結構與python中的二叉樹結構(PY數據結構-樹)相似&#xff0c;不過決策樹中除了葉節點之外的其他節點&#xff0c;都被稱之為“決策節點”&#xff0c;構建決策樹的過程&#xff0c;也就是選取每一個節點采用哪一個特征作為劃分依據的過程。 以…