【SpringBoot實戰】優雅關閉服務

文章目錄

  • 一、什么是優雅關閉?
  • 二、優雅關閉的核心步驟
  • 三、SpringBoot優雅關閉實現
  • 四、關鍵注意事項
    • 1. 超時時間必須配置
    • 2. 信號支持局限性
    • 3. 特殊請求處理
  • 五、底層實現原理
  • 六、總結

一、什么是優雅關閉?

優雅關閉(Graceful Shutdown) 是指服務在關閉或重啟時,先完成所有正在處理的請求,再安全終止進程的機制。這種機制能有效避免以下問題:

  • 用戶請求突然中斷導致的客戶端報錯
  • 數據庫事務執行到一半被強制終止
  • 負載均衡將流量導向正在關閉的節點

下面來看典型的架構場景:
在這里插入圖片描述
當對服務實例進行滾動更新時,若直接終止實例,正在處理的請求將失敗。

二、優雅關閉的核心步驟

  1. 流量摘除
    CI/CD系統將目標節點從負載均衡(如Nginx)的后端服務器組中移除
  2. 接收終止信號
    進程接收到操作系統發送的終止信號(如SIGTERM)
  3. 停止接收新請求
    服務立即關閉端口監聽,拒絕新請求進入
  4. 等待既有請求完成
    服務等待所有正在處理的請求完成(包括長任務)
  5. 進程安全退出
    資源清理后終止進程

三、SpringBoot優雅關閉實現

自 SpringBoot 2.3.0 起官方內置優雅關閉支持:
點擊訪問

在這里插入圖片描述
翻譯過來這句話的意思就是:

將 Web 服務的優雅關閉集成到應用程序上下文(ApplicationContext)的生命周期處理中

配置方式(application.yml)

server:shutdown: graceful  # 啟用優雅關閉(支持Tomcat/Jetty/Undertow等Web容器)spring:lifecycle:timeout-per-shutdown-phase: 60s  # 最大等待時間(超時后強制關閉),生產環境必須設置!

四、關鍵注意事項

1. 超時時間必須配置

  • 為什么需要超時?
    防止因某些請求阻塞(如慢SQL、死循環)導致實例永遠無法關閉
  • 推薦設置
    根據業務最長處理時間設定(通常 ≥ 最大請求超時時間 × 2)

2. 信號支持局限性

信號名稱是否觸發優雅關閉說明
SIGTERM?kill -15(默認推薦)
SIGINT?Ctrl+C 或 kill -2
SIGKILL?kill -9 立即強制終止

📌 生產環境應使用 SIGTERM 觸發關閉

3. 特殊請求處理

  • 長輪詢/WebSocket連接:需要業務層實現連接關閉通知
  • 批處理任務:建議拆分可中斷任務,或記錄任務狀態

五、底層實現原理

SpringBoot 通過注冊 Shutdown Hook 實現:

Runtime.getRuntime().addShutdownHook(new Thread(() -> {// 1. 關閉ServerSocket停止接收請求// 2. 檢查活動請求計數器// 3. 等待計數器歸零或超時
}));

六、總結

通過 SpringBoot 原生支持的優雅關閉機制,配合基礎設施的流量控制,可實現服務的零中斷發布。關鍵點在于:

  1. 正確配置 server.shutdown=graceful + 超時時間
  2. 使用 SIGTERM 而非 SIGKILL 終止進程
  3. 基礎設施層保證流量摘除先于進程終止

生產環境發布效果對比:
未啟用優雅關閉:發布期間錯誤率飆升
啟用后:錯誤率曲線保持平穩 🚀

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

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

相關文章

C++哈希表:unordered系列容器詳解

本節目標 1.unordered系列關聯式容器 2.底層結構 3.模擬實現 4.哈希的應用 5.海量數據處理面試題 unordered系列關聯式容器 在c98中,STL提供了底層為紅黑樹結構的一系列關聯式容器,在查詢時效率可以達到logN,即最差的情況下需要比較紅…

java操作服務器文件(把解析過的文件遷移到歷史文件夾地下)

第一步導出依賴 <dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core</artifactId><version>2.13.0</version></dependency> 第二步寫代碼 public void moveFile( List<HmAnalysisFiles> hmAnalys…

Oracle OCP認證的技術定位怎么樣?

一、引言&#xff1a;Oracle OCP認證的技術定位? Oracle Certified Professional&#xff08;OCP&#xff09;認證是數據庫領域含金量最高的國際認證之一&#xff0c;其核心價值在于培養具備企業級數據庫全生命周期管理能力的專業人才。隨著數字化轉型加速&#xff0c;OCP認證…

TK海外搶單源碼/指定卡單

? 搶單源碼&#xff0c;有指定派單&#xff0c;打針&#xff0c;這套二改過充值跳轉客服 前端vue 后端php 兩端分離 可二開 可以指定卡第幾單&#xff0c;金額多少&#xff0c; 前后端開源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接靜態 偽靜…

遠程線程注入

注入簡單來說就是讓別人的程序執行 你想要讓他執行的dll #include<iostream> #include<Windows.h> using namespace std;char szBuffer[] "C:\\Users\\20622\\source\\repos\\Dll1\\Debug\\test.dll"; //dll路徑void RemoteThreadInject(DWORD Pid,PCH…

【Java實戰】集合排序方法與長度獲取方法辨析(易懂版)

一、排序方法 1. 對List排序的兩種方式 方式一Collections.sort() List<Integer> numbers Arrays.asList(3,1,4,2); Collections.sort(numbers); // 直接修改原list → [1,2,3,4]方式二&#xff1a;list.sort()&#xff08;Java8推薦&#xff09; List<String>…

企業級安全實踐:SSL/TLS 加密與權限管理(一)

引言 ** 在數字化轉型的浪潮中&#xff0c;企業對網絡的依賴程度與日俱增&#xff0c;從日常辦公到核心業務的開展&#xff0c;都離不開網絡的支持。與此同時&#xff0c;網絡安全問題也日益嚴峻&#xff0c;成為企業發展過程中不可忽視的重要挑戰。 一旦企業遭遇網絡安全事…

Java 大視界 -- Java 大數據在智能醫療影像數據壓縮與傳輸優化中的技術應用(227)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

Python編程基礎(一) | 變量和簡單數據類型

引言&#xff1a;很久沒有寫 Python 了&#xff0c;有一點生疏。這是學習《Python 編程&#xff1a;從入門到實踐&#xff08;第3版&#xff09;》的課后練習記錄&#xff0c;主要目的是快速回顧基礎知識。 練習1&#xff1a; 簡單消息 將一條消息賦給變量&#xff0c;并將其…

鴻蒙 HarmonyOS - SideBarContainer 組件自學指南

在日常開發中&#xff0c;如果你有類似「左側導航 右側內容」的布局需求&#xff0c;比如后臺管理界面、文件管理器、設置頁等&#xff0c;??SideBarContainer?? 是非常值得掌握的組件。它自帶側邊欄和主內容區的分離機制&#xff0c;還支持折疊、拖拽、控制按鈕和多種顯示…

CppCon 2014 學習:Practical Functional Programming

這段內容是對**在 C 中使用函數式編程&#xff08;Functional Programming, FP&#xff09;**可以做什么的簡要介紹&#xff0c;下面是逐條的翻譯與理解&#xff1a; Introduction 簡介 在 C 中使用函數式編程&#xff08;FP&#xff09;可以做什么&#xff1f; 1. 編寫強大…

飛牛NAS+Docker技術搭建個人博客站:公網遠程部署實戰指南

文章目錄 前言1. Docker下載源設置2. Docker下載WordPress3. Docker部署Mysql數據庫4. WordPress 參數設置5. 飛牛云安裝Cpolar工具6. 固定Cpolar公網地址7. 修改WordPress配置文件8. 公網域名訪問WordPress總結 前言 在數字化浪潮中&#xff0c;傳統網站搭建方式正面臨前所未…

ComfyUI+阿里Wan2.1+內網穿透技術:本地AI視頻生成系統搭建實戰

文章目錄 前言1.軟件準備1.1 ComfyUI1.2 文本編碼器1.3 VAE1.4 視頻生成模型 2.整合配置3. 本地運行測試4. 公網使用Wan2.1模型生成視頻4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址總結 前言 各位技術愛好者&#xff0c;今天為您帶來一組創新性的AI應用方案&#xff01…

n8n:技術團隊的智能工作流自動化助手

在當前數字化時代,自動化已經成為提高效率和減輕人工工作負擔的一大推動力。今天,我們要為大家介紹一款極具潛力的開源項目——n8n,它不僅擁有廣泛的應用場景,還具備內置AI功能,能夠完全滿足技術團隊的高效工作需求。n8n的出現,為技術團隊提供了自由編程與快速自動化構建…

1,QT的編譯教程

目錄 整體流程: 1,新建project文件 2,編寫源代碼 3,打開QT的命令行窗口 4,生成工程文件(QT_demo.pro) 5,生成Make file 6,編譯工程 7,運行編譯好的可執行文件 整體流程: 1,新建project文件 新建文本文件,后綴改為.cpp 2,編寫源代碼

深度學習論文: FastVLM: Efficient Vision Encoding for Vision Language Models

深度學習論文: FastVLM: Efficient Vision Encoding for Vision Language Models FastVLM: Efficient Vision Encoding for Vision Language Models PDF: https://www.arxiv.org/abs/2412.13303 PyTorch代碼: https://github.com/shanglianlm0525/CvPytorch PyTorch代碼: https…

十一、【核心功能篇】測試用例管理:設計用例新增編輯界面

【核心功能篇】測試用例管理&#xff1a;設計用例新增&編輯界面 前言準備工作第一步&#xff1a;創建測試用例相關的 API 服務 (src/api/testcase.ts)第二步&#xff1a;創建測試用例編輯頁面組件 (src/views/testcase/TestCaseEditView.vue)第三步&#xff1a;配置測試用例…

三、web安全-信息收集

1、信息搜集的重要性 &#xff08;1&#xff09;明確攻擊面 信息搜集能讓滲透測試人員清晰地勾勒出目標系統的邊界&#xff0c;包括其網絡拓撲結構、開放的服務端口、運行的軟件系統等。例如&#xff0c;通過信息搜集發現目標企業除了對外提供官網服務外&#xff0c;還有一個…

生活小記啊

最近生活上的事情還是蠻多的&#xff0c;想到哪寫到哪。 工作 三月的某個周六&#xff0c;正在加班寫技術方案&#xff0c;大晚上寫完了聽到調動通知&#xff0c;要去新的團隊了。 還是蠻不舍的&#xff0c;看著產品從無到有&#xff0c;一路走過來&#xff0c;傾注了不少感…

vue-08(使用slot進行靈活的組件渲染)

使用slot進行靈活的組件渲染 作用域slot是 Vue.js 中的一種強大機制&#xff0c;它允許父組件自定義子組件內容的呈現。與僅向下傳遞數據的常規 props 不同&#xff0c;作用域 slot 為父級提供了一個模板&#xff0c;然后子級可以填充數據。這提供了高度的靈活性和可重用性&am…