springboot + nacos + k8s 優雅停機

1 概念

優雅停機是什么?網上說的優雅下線、無損下線,都是一個意思。

優雅停機,通常是指在設備、系統或應用程序中止運作前,先執行一定的流程或動作,以確保數據的安全、預防錯誤并保證系統的整體穩定。

一般來說,優雅停機可以參考以下步驟以實現:

  1. 備份數據 :立即將內存中的所有未保存的修改、緩存等數據保存到數據庫或磁盤中。

  2. 停止接收新的請求

  3. 處理未完成的請求

  4. 通知其他依賴組件

  5. 等待所有要素安全退出后,關閉系統

在具體實施時,不同的設備、不同的系統、不同的應用,所需要的優雅停機步驟也不盡相同,甚至需要根據不同的場景來選擇不同的方法。

例如,在某些情況下,你可能需要讓用戶知道,系統即將關閉,并告訴他們應當保存所有的工作并退出系統;而在另一些情況下,你可能需要設計一種策略,能夠讓系統在無用戶介入的情況下,自動保存所有的狀態,并在下次啟動時恢復之。

但是,無論在哪種情況下,優雅停機的目標都是保護數據,避免錯誤,并盡量減少到訪用戶或使用者的不便。

上面的步驟,其實還缺了不少基礎的內容,比如,停止請求外,還要停止接收定時任務、停止接收mq消息,等待他們的完成,這2項都是我們微服務中必不可缺的能力。

因此,我希望通過本文,能夠更清晰,更詳細的講解,在我已知的真實業務場景下,如何做優雅停機。

文中,很多內容不會講得太詳細,需要大家有一定的搜索能力或者經驗!

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 視頻教程:https://doc.iocoder.cn/video/

2 用案例說話

隨著微服務的興起,運維方式由docker -> k8s 變化,優雅停機涉及到的點就越來越多!下面,我們用一個案例,說明優雅停機中的問題和問題解決方案。

案例前:k8s 停機流程

當程序員執行 kubectl delete pod 命令時,兩個過程開始:

網絡規則即將生效:

  • Kube-apiserver 收到 pod 刪除請求,并將 pod 的狀態更新為 Extinating at Etcd;

  • 終結點控制器從終結點對象中刪除 Pod 的 IP;

  • Kuber-proxy 根據 Endpoint 對象的更改更新 iptables 的規則,并且不再將流量路由到已刪除的 pod。

刪除容器:

  • Kube-apiserver 收到 pod 刪除請求,并將 pod 的狀態更新為 Extinating at Etcd;

  • Kubelet 清理節點處的容器相關資源,如存儲、網絡;

  • 添加 Prestop hook 鉤子,等待流量不再發給pod;

  • Kubelet 將SIGTERM發送到容器;

  • 如果容器在默認的 30 秒內沒有退出,Kubelet 將發送 SIGKILL 并強制其退出。

?

k8s + springboot + nacos 案例

?

PreStopHook 做了2件事情:

  1. nacos反注冊

  2. 休眠35秒

通過信號量關閉springboot程序;

其中,k8s的 terminationGracePeriodSeconds(寬限期)設置為35s。

問題

springBoot程序關閉時間只有2s, 那么該程序就無法處理完一些線程任務、異步消息、定時任務等。為什么呢?

寬限期設置了35s,PreStop休眠了35s + 一個請求的時間,超過了寬限期,那么 kubelet 就會給與 pod 增加一次性2s的寬限時間。Pod 的生命周期,2s不管程序是否正常結束,都會被Kill -9。

為什么反注冊之后需要休眠35s?

這里涉及到nacos服務發現原理,nacos服務變更響應時間:實時;ribbon 默認緩存刷新時間30s;因此,一開始是設置30s的,發現還有feign請求失敗的情況,所以設置成了35s以解決這個問題!

nacos服務變更響應時間真的是實時嗎?

其實并不一定,nacos服務發現是通過http和udp實現的,udp是實時的,http最大等待時間是10s,但是,udp端口生產環境可能沒有開放!所以,案例中的nacos服務發現僅通過http定時輪詢實現。

案例優化

上面的案例可以優化的點

  • nacos 反注冊后休眠35s,是否可以減少;

  • terminationGracePeriodSeconds 設置多少合理?

優化點1

反注冊后休眠的35s時候受到nacos服務發現 + ribbon 緩存刷新時間影響,正常應該是 服務發現時間 + 緩存刷新時間 40s才能在極端情況下保證服務停機時,不會再有feign 請求進入。

如果想要縮短這個時間

  • 啟用udp,這個需要和運維同學商量,否則10s等待少不了;

  • 監聽nacos服務變更通知,發現服務下線后,及時刷新ribbon緩存;

/** * 訂閱 nacos 實例變更通知 * 手動刷新 ribbon 服務實例緩存 * nacos client 1.4.6 【1.4.1有重大缺陷,要注意】 */ @Component @Slf4j publicclass NacosInstancesChangeEventListener extends Subscriber<InstancesChangeEvent> { @Resource private SpringClientFactory springClientFactory; @PostConstruct public void registerToNotifyCenter(){ NotifyCenter.registerSubscriber(this); } @Override public void onEvent(InstancesChangeEvent event) { String service = event.getServiceName(); // service: DEFAULT_GROUP@@demo ribbonService: demo String ribbonService = service.substring(service.indexOf("@@") + 2); log.info("#### 接收到微服務nacos實例變更事件:{} ribbonServiceName: {}", event.getServiceName(), ribbonService); ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(ribbonService); if(loadBalancer != null){ ((ZoneAwareLoadBalancer<?>) loadBalancer).updateListOfServers(); log.info("刷新 ribbon 服務實例:{} 緩存成功", ribbonService); } } @Override public Class<? extends com.alibaba.nacos.common.notify.Event> subscribeType() { return InstancesChangeEvent.class; } /** * nacos 1.4.4 ~ 1.4.6 需要加這個方法的實現, 2.1.2以后版本修復了該問題 * 多注冊中心時,變更事件沒有隔離,因此需要實現該方法來判斷事件是否需要處理 * @see <a href="https://github.com/alibaba/nacos/issues/8428">ISSUE #8428 - Nacos InstancesChange Event Scope</a> * **/ @Override public boolean scopeMatches(InstancesChangeEvent event) { returntrue; } }

優化點2

terminationGracePeriodSeconds 的值應該略大于 PreStop耗時 + springBoot 停機時間,springBoot 停機時間是由程序業務決定的(mq消息、定時任務、線程池任務、以及備份數據),網上的推薦做法是啟用springBoot的優雅停機功能,并實現自定義的關閉邏輯。

springBoot優雅停機的默認緩沖時間是30s,因此,terminationGracePeriodSeconds的時間個人建議10 + 30s即可。

經過優化后

?

使用 actuator shutdown 方案

有些網貼推薦使用 actuator shutdown 進行優雅停機,那么看下其流程圖:

?

其實,真正的情況并非如上圖所示,因為調用shutdown后,springBoot就會進入優雅停機流程,但是這個流程沒有結束,然后就會被kill -15 中斷,如果線程池沒有做好配置,線程池任務沒有結束,服務就會關閉。

// 沒有設置下面參數,在kill -15時,線程池沒有執行結束,會被強制關閉 threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); threadPoolTaskExecutor.setAwaitTerminationSeconds(30);

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud

  • 視頻教程:https://doc.iocoder.cn/video/

3 再次優化

mq 和 定時任務

上面的方案中,提到nacos反注冊時,其他服務監聽反注冊事件,進行ribbon緩存刷新,那么,反注冊的服務(停機服務)自身,是否可以也監聽該事件呢?答案是可以的。

停機的服務監聽nacos反注冊事件,判斷是自己反注冊了,表示準備關機,那么就可以停止對mq消息的監聽,停止定時任務,這樣就比在優雅停機時,進行mq 和 定時任務的停止更完美。

?

流量控制

如果沒有使用k8s進行pod節點的流量控制,那么大概率會使用 springCloud gateway作為服務網關,因此,gateway 服務也應該監聽nacos的反注冊事件,從而及時刷新ribbon的緩存,關閉停機服務的流量。

4 小結

經過大量的資料參考、學習,最終得到的一份自己認為合格的優雅停機方案,里面可能有較多的不專業表述,敬請諒解和指正,謝謝。

在本文的最后,還要說下,優雅停機最大的挑戰并不是來源于這個優雅停機流程,機械化的流程前人都幫忙躺過了,剩下的是業務服務自身的邏輯:

  • 有沒有包含超過30s的業務邏輯,如執行超過30s的請求,定時任務、線程池任務或mq消息;

  • 服務關閉時,如何保存未完成的任務、數據,實現自定義的關閉邏輯;

  • 接口邏輯是否做了冪等;

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

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

相關文章

Python 標準庫之 math 模塊

1. 前言 math 模塊中包含了各種浮點運算函數&#xff0c;包括&#xff1a; 函數功能floor向下取整ceil向上取整pow指數運算fabs絕對值sqrt開平方modf拆分小數和整數fsum計算列表中所有元素的累加和copysign復制符號pi圓周率e自然對數 2. math.floor(n) 函數 math.floor(n) 的…

6.14星期六休息一天

Hey guys, Today’s Saturday, and I didn’t have to go to work, so I let myself sleep in a bit — didn’t get up until 8 a.m. My cousin invited me over to his place. He lives in a nearby city, about 80 kilometers away. But honestly, after a long week, I …

event.target 詳解:理解事件目標對象

event.target 詳解&#xff1a;理解事件目標對象 在 JavaScript 事件處理中&#xff0c;event.target 是一個關鍵屬性&#xff0c;它表示最初觸發事件的 DOM 元素。下面我將通過一個可視化示例詳細解釋其工作原理和使用場景。 <!DOCTYPE html> <html lang"zh-C…

Flutter 小技巧之:實現 iOS 26 的 “液態玻璃”

隨著 iOS 26 發布&#xff0c;「液態玻璃」無疑是熱度最高的標簽&#xff0c;不僅僅是因為設計風格大變&#xff0c;更是因為 iOS 26 beta1 的各種 bug 帶來的毛坯感讓 iOS 26 沖上熱搜&#xff0c;比如通知中心和控制中心看起來就像是一個半成品&#xff1a; 當然&#xff0c;…

Android工程中FTP加密傳輸與非加密傳輸的深度解析

詳細的FTP傳輸實現方案&#xff0c;包括完整代碼、安全實踐、性能優化和實際應用場景分析。 一、FTP傳輸類型對比表&#xff08;增強版&#xff09; 特性非加密FTPFTPS (FTP over SSL/TLS)SFTP (SSH File Transfer Protocol)協議基礎FTP (RFC 959)FTP SSL/TLS (RFC 4217)SSH…

C# 枚 舉(枚舉)

枚舉 枚舉是由程序員定義的類型&#xff0c;與類或結構一樣。 與結構一樣&#xff0c;枚舉是值類型&#xff1a;因此直接存儲它們的數據&#xff0c;而不是分開存儲成引用和數據。枚舉只有一種類型的成員&#xff1a;命名的整數值常量。 下面的代碼展示了一個示例&#xff0c…

一文詳解前綴和:從一維到二維的高效算法應用

文章目錄 一、一維前綴和?1. 基本概念?2. C 代碼實現?3. 應用場景? 二、二維前綴和1. 基本概念?2. C 代碼實現?3. 應用場景? 三、總結? 在算法競賽和日常的數據處理工作中&#xff0c;前綴和是一種極其重要的預處理技術。它能夠在常數時間內回答多次區間查詢&#xff0…

windows 開發

文章目錄 環境搭建數據庫關鍵修改說明&#xff1a;在代碼中使用該連接字符串&#xff1a;注意事項&#xff1a;實際使用 都說幾天創造一個奇跡&#xff0c;現在是真的這樣了&#xff0c;Just do it! 環境搭建 數據庫 需要下載這個SQL Server數據庫&#xff0c;然后每次Visua…

免費OCPP協議測試工具

免費OCPP 1.6J協議測試工具&#xff0c;簡單實用。除加密功能外&#xff08;后續版本支持&#xff09;&#xff0c;支持所有消息調試。 后續將添加2.01和和2.1協議支持. 歡迎使用 Charge-Test

高等數學基礎(行列式和矩陣的秩)

行列式主要用于判斷矩陣是否可逆及計算特征方程 初見行列式 行列式起源于線性方程組求解 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1 a_{12}x_2 b_1 \\ a_{21}x_1 a_{22}x_2 b_2 \end{cases} {a11?x1?a12?x2?b1?a21?x1?a22?x2…

開心燦爛go開發面試題

1.給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例1: 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1] package main import “fmt” type ListNode struct { Val int Next *ListNode } func main() { l1 : &…

【Flutter】程序報錯導致的灰屏總結

【Flutter】程序報錯導致的灰屏總結 一、前言 在 Flutter 中&#xff0c;出現“灰屏”&#xff08;grey screen&#xff09;通常意味著 應用發生了未捕獲的錯誤&#xff0c;導致框架無法正確構建 UI。 這也是在面試過程中常常問到的。 二、錯誤分類 常見的會導致灰屏的錯誤…

基于物聯網設計的智慧家庭健康醫療系統

1. 項目開發背景 隨著物聯網&#xff08;IoT&#xff09;技術的發展&#xff0c;智能家居系統逐漸融入到我們的日常生活中&#xff0c;成為提高生活質量、增強家庭安全、提升健康管理的重要工具。特別是在健康醫療領域&#xff0c;借助物聯網技術&#xff0c;智能家居不僅能夠…

設計模式精講 Day 1:單例模式(Singleton Pattern)

【設計模式精講 Day 1】單例模式&#xff08;Singleton Pattern&#xff09; 文章內容 開篇 在軟件開發中&#xff0c;設計模式是解決常見問題的通用解決方案。作為“設計模式精講”系列的第一天&#xff0c;我們將深入講解單例模式&#xff08;Singleton Pattern&#xff09…

【衛星通信】3GPP標準提案:面向NB-IoT(GEO)場景的IMS信令優化方案-降低衛星通信場景下的語音呼叫建立時延

一、引言 隨著5G非地面網絡&#xff08;NTN&#xff09;技術的演進&#xff0c;基于NB-IoT的衛星通信&#xff08;如GEO地球同步軌道衛星&#xff09;逐漸成為偏遠地區語音服務的重要補充。然而&#xff0c;傳統IP多媒體子系統&#xff08;IMS&#xff09;的信令流程在帶寬受限…

軟件測試之簡單基礎的安全測試方法(另外包含軟測面試題庫)

文章目錄 前言安全測試是什么簡單基礎的安全測試方法密碼安全操作權限驗證SQL注入xss腳本攻擊文件上傳下載安全漏洞掃描Web掃描APP掃描 面試題庫&#xff08;僅參考&#xff09;參考目錄 前言 閱讀本文前請注意最后編輯時間&#xff0c;文章內容可能與目前最新的技術發展情況相…

LCEL:LangChain 表達式語言詳解與測試工程師的實踐指南

引言 在 AI 應用開發中&#xff0c;如何高效地組合多個步驟&#xff08;如提示模板、模型調用、輸出解析&#xff09;并優化執行流程&#xff0c;是開發者和測試工程師共同面臨的挑戰。LangChain Expression Language (LCEL) 作為 LangChain 的核心功能之一&#xff0c;提供了…

LeetCode面試經典150題—旋轉數組—LeetCode189

原題請見&#xff1a;Leetcode189-旋轉數組 1、題目描述 2、題目分析 首先容易想到的最簡單的方案&#xff0c;是算出來移動K步之后&#xff0c;新數組的每一個坐標與原坐標的映射關系&#xff0c;然后根據映射關系放到一個全新的數組&#xff0c;再把新數組的值賦給原數組。…

2.5 Rviz使用教程

新建終端&#xff0c;鍵入命令 roslaunch wpr_simulation wpb_simple.launch 再新建終端&#xff0c;鍵入命令 rviz修改Fix Frame 為 base_footprint 點擊add之后選擇RobotModel 再增加一個LaserScan 選擇激光雷達話題 可視化效果 配置的兩種方法 1.在Gazebo運行的基礎上&…

基于SpringBoot+JSP開發的招投標采購信息平臺

角色&#xff1a; 管理員、普通用戶 技術&#xff1a; 后端&#xff1a;Spring Boot Mybatis-Plus MySQL 前端&#xff1a;JSP 核心功能&#xff1a; 該平臺是一個用于管理投標和招標信息的系統&#xff0c;主要提供信息發布、用戶管理和交易管理等核心功能。 功能介紹…