Spring Boot 3 + Undertow 服務器優化配置

優化背景

當你的application需要支持瞬時高并發的時候,tomcat已經不在是最優的選擇,我們可以改為Undertow,并對其進行優化。

Undertow 是一個輕量級的、高性能的Java Web 服務器,由JBoss 開發并開源。它是基于非阻塞(non-blocking)的I/O模型,具有低資源消耗和高并發處理能力。

SpringBoot3如何從tomcat改為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>

多線程優化配置

在?application.yml?或?application.properties?中添加以下配置:

server:undertow:# 線程池配置threads:# I/O線程數(建議設置為CPU核心數的1-2倍)io: 16# 工作線程數(建議設置為CPU核心數的8-16倍)worker: 256# 緩沖池配置buffer-size: 1024# 是否直接使用內存作為緩沖區direct-buffers: true

限制接口超時時間

server:undertow:# 請求超時設置(毫秒)no-request-timeout: 30000# 連接空閑超時(毫秒)idle-timeout: 60000

限制請求體大小不超過2KB

server:undertow:# 限制HTTP POST請求體大小(2KB=2048字節)max-http-post-size: 2048

請求壓縮配置

SpringBoot的server compression功能用于減少響應數據的大小,從而提高傳輸效率,減少帶寬占用,加快頁面加載速度。它通常使用GzipDeflate等壓縮算法來優化HTTP響應。

作用

  1. 減少數據傳輸量:壓縮后數據體積更小,降低網絡開銷。

  2. 提高加載速度:特別適用于前端頁面、API接口等場景。

  3. 降低服務器負載:減少數據傳輸時間,提高服務器吞吐量。

  4. 優化用戶體驗:頁面加載更快,提升訪問流暢度。

推薦配置

在SpringBoot的application.ymlapplication.properties中啟用壓縮:

server:compression:enabled: true  # 開啟壓縮min-response-size: 1024  # 觸發壓縮的最小響應大小(默認2KB)mime-types: application/json, text/html, text/xml, text/plain, text/css, application/javascript  # 需要壓縮的內容類型excluded-user-agents: IE6, IE7  # 排除舊版瀏覽器

啟用HTTP/2 (需要SSL支持)

server:http2:enabled: true

Undertow 訪問日志配置

server:undertow:accesslog:enabled: truedir: ./logsprefix: access_log.suffix: .logpattern: '%t %a "%r" %s (%D ms)'rotate: true
 

監控與調優建議

  1. 監控線程池狀態:通過JMX或Actuator監控線程池使用情況

  2. 壓力測試:使用JMeter或wrk進行負載測試,觀察線程池表現

  3. JVM調優:根據負載情況調整JVM堆內存和GC參數

  4. 連接池調優:如果使用數據庫,確保連接池配置與服務器線程數匹配 (SpringBoot3 + Druid + DynamicDataSource + PgSQL 連接池優化方案-CSDN博客)

附錄:Undertow配置屬性

Spring Boot 預置了很多屬性,可用于在?applicaton.properties | yaml?中對 Undertow 服務器進行個性化配置。

它們都以?server.undertow.*?開頭,總結如下:

配置項說明示例
server.undertow.accesslog.dirUndertow 訪問日志目錄。
server.undertow.accesslog.enabled是否啟用訪問日志。false
server.undertow.accesslog.pattern訪問日志的格式。common
server.undertow.accesslog.prefix日志文件前綴。access_log.
server.undertow.accesslog.rotate是否開啟日志滾動。true
server.undertow.accesslog.suffix日志文件后綴。log
server.undertow.always-set-keep-alive是否應在所有響應中添加?Connection: keep-alive?Header,即使 HTTP 規范沒有要求。true
server.undertow.buffer-size每個 buffer 的大小。默認大小是根據 JVM 可用的最大內存確定的。
server.undertow.decode-slash是否應解碼已編碼的斜線字符(%2F)。如果前端代理不執行相同的解碼,解碼可能會導致安全問題。只有在傳統應用程序需要時才啟用。設置后,server.undertow.allow-encoded-slash?無效。
server.undertow.decode-url是否對 URL 進行解碼。禁用時,URL 中的百分比編碼字符將保持原樣。true
server.undertow.direct-buffers是否在 Java 堆外分配 buffer。默認大小是根據 JVM 可用的最大內存確定的。
server.undertow.eager-filter-init是否應在啟動時初始化 servlet Filtertrue
server.undertow.max-cookies允許的最大 cookie 數量。這一限制是為了防止基于哈希碰撞的 DOS 攻擊。200
server.undertow.max-headers允許的最大 header 數量。這一限制是為了防止基于哈希碰撞的 DOS 攻擊。
server.undertow.max-http-post-sizeHTTP post content 的最大大小。當值為-1(默認值)時,大小為無限。-1B
server.undertow.max-parameters允許查詢或路徑參數的最大數量。這一限制是為了防止基于哈希碰撞的 DOS 攻擊。
server.undertow.no-request-timeout在服務器關閉連接之前,連接在不處理請求的情況下閑置的時間。
server.undertow.options.server.*在?io.undertow.UndertowOptions?中定義的服務器選項。
server.undertow.options.socket.*在?org.xnio.Options?中定義的 socket 選項。
server.undertow.preserve-path-on-forward轉發請求時是否保留請求路徑。false
server.undertow.threads.ioI/O 線程數。默認值為可用的處理器數量。
server.undertow.threads.workerWorker 線程數。默認為 I/O 線程數的 8 倍。
server.undertow.url-charset用于解碼 URL 的字符集。UTF-8

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

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

相關文章

利用 Python pyttsx3實現文字轉語音(TTS)

今天&#xff0c;我想跟大家分享如何利用 Python 編程語言&#xff0c;來實現文字轉換為語音的功能&#xff0c;也就是我們常說的 Text-to-Speech (TTS) 技術。 你可能會好奇&#xff0c;為什么學習這個&#xff1f;想象一下&#xff0c;如果你想把書本、文章、雜志的內容轉換…

vue修改了node_modules中的包,打補丁

1、安裝patch npm i patch-package 安裝完成后&#xff0c;會在package.json中顯示版本號 2、在package.json的scripts中增加配置 "postinstall": "patch-package" 3、執行命令 npx patch-package 修改的node_modules中的包的名稱 像這樣 npx patch-packag…

Vue3快速入門/Vue3基礎速通

Vue3 漸進式的javascript框架&#xff0c;我們可以逐步引入vue的功能 官方文檔 Vue.js中文手冊 你可以借助 script 標簽直接通過 CDN 來使用 Vue&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script>通過 CDN 使用 Vue 時…

[人機交互]理解界面對用戶的影響

零.重點 – 什么是情感因素 – 富有表現力的界面 – 用戶的挫敗感 – 擬人化在交互設計中的應用 – 虛擬人物&#xff1a;代理 一.什么是情感方面 情感是指某事物對心理造成的一種狀態 二.計算機科學中存在的兩個相關的研究領域 2.1情感計算 機器如何能感知其他代理的情感&…

Ubuntu22.04及以上版本buildroot SIGSTKSZ 報錯問題

本文提供一種解決 Buildroot SIGSTKSZ 報錯途徑 解決途徑來源參考&#xff1a;Buildroot error when building with Ubuntu 21.10 其出現原因在于 GNU C Library 2.34 release announcement&#xff1a; Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…

Spark處理過程-案例數據清洗

&#xff08;一&#xff09;需求說明 準備十條符合包含用戶信息的文本文件&#xff0c;每行格式為 姓名,年齡,性別&#xff0c;需要清洗掉年齡為空或者非數字的行。 例如&#xff1a; 張三,25,男 李四,,女 王五,30,男 趙六,a,女 孫七,35,男 周八,40,女 吳九,abc,男 鄭十,45,女…

多模態大語言模型arxiv論文略讀(六十五)

VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ?? 論文標題&#xff1a;VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ?? 論文作者&#xff1a;Zhen Chen, Xingjian Luo, Jinlin Wu, Danny T. M. Chan, Zhen Lei, Jinqi…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戲</title> <style>bo…

算法訓練營第十一天|150. 逆波蘭表達式求值、239. 滑動窗口最大值、347.前 K 個高頻元素

150. 逆波蘭表達式求值 題目 思路與解法 第一思路&#xff1a; 比較簡單 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …

原生 IP(Native IP)

目錄 一、核心特點 二、原生 IP 的常見應用 三、原生 IP vs. 數據中心 IP 四、如何獲取原生 IP&#xff1f; 五、原生 IP 的優缺點 六、實際案例 原生 IP&#xff08;Native IP&#xff09; 是指由互聯網服務提供商&#xff08;ISP&#xff09;直接分配給用戶的 IP 地址&…

k8s的pod掛載共享內存

k8s的pod掛載共享內存&#xff0c;限制不生效問題&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系統中用于共享內存的特殊路徑。通過將 emptyDir 的 medium 設置為 Memory&#xff0c;可以確保 /dev/shm 正確地掛載到一個基于內存的文件系統&#xff0c;從而實現高效的共享內…

DOCX轉PDF怎么操作最簡單?快速將DOCX轉換為專業PDF文檔

在日常辦公或學習中&#xff0c;我們經常需要將 Word 文檔&#xff08;.docx格式&#xff09;轉換為 PDF 文件。這不僅有助于保持文檔格式的一致性&#xff0c;還能確保接收者無需特定軟件即可查看文件內容。本文將詳細介紹幾種常見的方法來實現從 DOCX 到 PDF 的轉換&#xff…

VUE+ElementUI 使用el-input類型type=“number” 時,取消右邊的上下箭頭

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 在項目中有時候需要輸入框的type“number”&#xff0c;這個時候&#xff0c;輸入框的右邊就會出現兩個按鈕&#xff0c;這兩個按鈕可以遞增/遞減&#xff0c;但是這樣輸入框看上去就不太美觀&#x…

深入淺出理解常見的分布式ID解決方案

目錄 UUID 自增ID 數據庫多主模式 號段模式 Redis 雪花算法 百度 UIDgenerator 美團Leaf 滴滴TinyID 實戰中的分布式ID生成器&#xff01;保障數據唯一性的核心組件 怎么編寫Lua腳本是關鍵 怎么執行&#xff1f; 總結 分布式ID在構建大規模分布式系統時扮演著至關…

技術視界 | 青龍機器人訓練地形詳解(一):如何創建一個地形

機器人強化學習中的地形訓練是利用強化學習算法讓機器人在不同地形環境中通過試錯學習最優行為策略的過程&#xff0c;通過環境建模、策略學習與優化等環節&#xff0c;使機器人能夠自主適應復雜多變的地形&#xff0c;提高其移動效率、穩定性和自主性&#xff0c;減少人為干預…

【SGL】Scatter-Gather List內存傳輸技術

文章目錄 1. What is SGL&#xff1f;2. sgl內存傳輸的原理2.1 核心思想2.2 sgl數據結構2.3 摘鏈和掛鏈 3. 零拷貝技術3.1 問題背景3.2 零拷貝的核心思想及實現方式 4. sgl在存儲行業的應用 1. What is SGL&#xff1f; sgl&#xff08;Scatter-Gather List&#xff09;內存傳…

10.idea中創建springboot項目_jdk17

10.idea中創建springboot項目_jdk17 一、前期準備 安裝與配置&#xff1a; 確保已安裝 IntelliJ IDEA配置好 JDK17 二、創建 Maven 項目 新建項目&#xff1a; 點擊 File → New → Project&#xff0c;選擇左側的 Maven。填寫項目名稱&#xff08;如 demo&#xff09;、存…

如何使用極狐GitLab 軟件包倉庫功能托管 ruby?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 軟件包庫中的 Ruby gems (BASIC ALL) WARNING:Ruby gems 軟件包庫正在開發中&#xff0c;由于功能有限&#xff0c;尚未準備好…

LeetCode 熱題 100 131. 分割回文串

LeetCode 熱題 100 | 131. 分割回文串 大家好&#xff0c;今天我們來解決一道經典的回溯算法問題——分割回文串。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求將一個字符串 s 分割成若干個子串&#xff0c;使得每個子串都是回文串&#xff0c;并返回所有可能的分割…

〖 Linux 〗操作系統進程管理精講(2)

文章目錄 1、環境變量基本概念常見環境變量查看環境變量方法測試 PATH測試 HOME和環境變量相關的命令環境變量的組織方式<p align"center">main 函數的三個參數通過代碼獲得環境變量通過系統調用獲取環境變量環境變量通常是具有全局屬性的 2、程序地址空間2.1 …