全部產品
Search
文件中心

Microservices Engine:無損上線

更新時間:Sep 09, 2025

對於任何一個線上應用來說,發布、擴容、重啟等操作不可避免。在應用啟動各階段,無損上線能提供相應的保護能力,包括服務延遲註冊、服務小流量預熱、服務就緒檢查三個功能。本文介紹MSE提供的無損上線功能。

無損上線功能概述

延遲註冊

微服務提供者執行個體會在應用啟動過程中,進行服務的註冊。一旦完成服務註冊,就可以被外部服務消費者應用訂閱和調用。對於基於Spring架構開發的Java應用而言,註冊過程一般發生在Spring上下文重新整理完畢之後。如果應用有一些非同步初始化邏輯還沒有執行完畢,就直接進行服務註冊,此時消費者前來調用時很可能會產生請求報錯。比如MaxCompute需要提前從OSS拉取幾百兆資料,待資料拉取完成後才能對外提供服務。因此如果應用啟動後直接註冊服務,會導致流量因資源未就緒而報錯。有了延遲註冊功能之後,我們可以通過設定一定的延遲時間,將原本的服務註冊動作往後延遲。讓應用在充分初始化後再註冊到註冊中心對外提供服務。避免了微服務提供者未準備完畢,就被外部調用,產生調用出錯的情況。

小流量預熱

很多時候,剛啟動的新執行個體會處於一種“冷機”狀態。冷機狀態下,需要進行比如串連池的懶載入、緩衝預熱、熱點代碼產生等操作,因此這些新執行個體對請求的處理能力會遠遠小於運行很久的執行個體。如果開發與營運人員不對這個過程進行幹涉,可能會造成新執行個體上線這段時間內,系統整體平均RT時間變高。更壞的情況下,還可能會造成服務“夯”住,導致大量請求調用逾時、報錯的情況。

下圖是需要進行資源載入的執行個體,在尚未完成資源載入的情況下,與資源載入完畢後的兩次請求調用時間長度對比。在資源載入過程中,如果有大量請求到達該執行個體,可能都會發生阻塞:

image

小流量預熱功能的思路是,在新服務執行個體剛上線的這段時間裡,控制消費者應用對其調用的流量大小,來避免Java應用冷啟動時請求處理能力差,系統整體RT變高的問題,並且保護新啟動的服務執行個體不會被大流量擊垮。進入該執行個體的流量會按一定規則隨時間不斷加大,當達到設定的預熱時間長度時,小流量預熱過程結束,執行個體正常接收流量。

說明

小流量預熱使用的是線上的消費者的流量,需要該服務執行個體的消費者應用也接入MSE服務治理,該功能的具體原理可參見小流量預熱原理

服務註冊狀態檢查

K8s提供了就緒檢查機制(Readiness Probe),在進行服務發布時,新執行個體就緒檢測通過後,就會下線舊的執行個體(具體情況取決於設定的發布策略)。然而K8s無法感知微服務何時就緒,當連接埠啟動時,K8s會認為應用已經就緒。這可能會導致剛啟動的服務還未註冊到註冊中心,就被K8s判定為已經就緒,進而繼續推進服務發布的動作,下線正在啟動並執行舊執行個體。從而引發消費端調用出錯,並在調用過程中出現service no provider/instance等異常。

無損上線的服務就緒檢查功能,通過Agent的無侵入方式為應用提供一個檢測其是否完成註冊的HTTP介面,如果未完成註冊,則返回500狀態代碼;當應用註冊完成後,會返回200狀態代碼。使用者將應用的就緒檢測配置成該介面後,可以協助K8s判定應用是否就緒,保障K8s情境下服務發布上線過程中,服務消費者一直有可用的提供者,不會產生無提供者的報錯。

使用無損上線

前提條件

注意事項

  • 目前只支援通過微服務註冊中心(如 Nacos)進行註冊發現體系下執行個體的無損上線,不支援 K8s Service 體系下微服務執行個體的無損上線。

  • 對於Spring Cloud應用,當前僅支援利用Nacos、ZooKeeper以及Eureka這三種類型的註冊中心構建的應用進行服務預熱。

  • Spring Cloud服務預熱功能是基於Spring Cloud架構預設的ZoneAwareLoadBalancerRoundRobinLoadBalancerRandomLoadBalancer負載平衡器實現的,如果應用本身修改了該配置,會導致服務預熱功能失效。

  • 服務預熱需要提供者、消費者都接入MSE服務治理才會生效。比如網關應用,是通過直接對外暴露 API的方式接收外部流量,因此MSE當前的小流量預熱功能對此類應用不生效。

使用方式

步驟一:開啟無損上線

  1. 登入MSE治理中心控制台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇治理中心 > 應用治理,然後單擊目標應用的資源量卡片。

  3. 在目標應用詳情頁面的左側導覽列,單擊流量治理,然後選擇無損上下線頁簽。

  4. 配置資訊模組,單擊修改,開啟無損上線按鈕,單擊下方確定

步驟二:配置k8s服務就緒檢查

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面單擊目的地組群,在左側導覽列選擇工作負載 > 無狀態,單擊部署的應用操作列下的編輯,在健全狀態檢查欄處,單擊就緒檢查右側的開啟,並配置如下參數。完成後單擊更新

    • 路徑:/readiness。(如果您的應用所使用的探針版本低於4.1.10,路徑需要配置成/health。查看探針版本方式:MSE 控制台 > 治理中心 > 應用治理 > 單擊對應的應用 > 節點詳情,右側可以看到探針版本)

    • 連接埠:55199。

    • 延遲探測時間(秒):推薦該值的配置大於應用啟動所需時間 + 無損上線功能模組中配置的延遲註冊時間(預設0秒)二者之和,如果您不按照該建議進行配置,不會影響功能正常使用

    2913e49926349db041e14b002921237b

重要

該操作會直接引起應用的重啟,如果是生產環境,建議您挑選發布視窗執行該操作!

(可選步驟)配置延遲註冊時間長度

請根據業務情境需要決定是否配置(詳情見延遲註冊),操作步驟如下:

  1. 根據步驟一、二進入無損上線功能頁面,開啟無損上線功能,並配置K8s服務就緒檢查。

  2. 修改無損上下線配置資訊,單擊無損上線模組左側箭頭展開配置選項,在延遲註冊時間長度(秒)處設定延遲註冊時間長度,然後單擊下方確定按鈕。

說明

設定完畢後,在下一次應用啟動時,延遲註冊時間長度才會生效。

(可選步驟)調整小流量預熱時間長度

開啟無損上線後,該功能會自動開啟。預設預熱時間長度為120秒。可以根據業務情境需要進行調整:

  1. 根據步驟一、二進入無損上線功能頁面,開啟無損上線功能,並配置K8s服務就緒檢查。

  2. 修改無損上下線配置資訊,單擊無損上線模組左側箭頭展開配置選項,單擊進階選項,在小流量預熱時間長度(秒)處設定小流量預熱時間長度,然後單擊下方確定按鈕。

  3. 如果您希望開啟小流量預熱的服務,其調用方是 MSE 雲原生網關,那麼這裡配置的小流量預熱無法生效。對應的解決方案是在 MSE 雲原生網關配置該服務的預熱:在雲原生網關控制台中,單擊目標網關執行個體,在左側導覽列的路由管理 > 服務頁簽中,找到該服務,單擊目標服務操作列下的更多 > 策略配置,在策略配置頁簽下的流量管理 > 負載平衡配置的右側,單擊編輯,調整配置項預熱時間即可。注意,雲原生網關預設的預熱 QPS 曲線圖形是一次曲線,和 MSE 服務治理提供的二次曲線略有差異,實際效果上差別不大。

說明
  • 設定完畢後,在下一次應用啟動時,調整後的小流量預熱時間長度才會生效。

  • 小流量預熱方法通過在服務消費端根據各個服務提供者執行個體的啟動時間計算權重,結合負載平衡演算法,控制剛啟動應用流量隨啟動時間逐漸遞增到正常水平的過程,協助剛啟動啟動並執行服務進行預熱。同時這也要求了服務消費者也接MSE服務治理

  • 建議您在首次使用無損上線的小流量預熱功能時,使用預設的預熱時間長度即可。如果在使用預設值預熱服務的過程中發現預熱效果不明顯,出現流量損失,再通過調節該參數進行最佳化。

  • 為了保證預熱充分,建議您參考小流量預熱最佳實務

無損上線觀測

經過上述配置後,當您的應用再次啟動時,可以在無損上下線功能頁面,看到應用執行個體上線下線的具體時間,以及同時期該執行個體的QPS曲線:

  1. 登入MSE治理中心控制台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇治理中心 > 應用治理,然後單擊目標應用的資源量卡片。

  3. 在目標應用詳情頁面的左側導覽列,單擊流量治理,然後選擇無損上下線頁簽。

  4. 上下線概覽中,單擊左側的上下線執行個體,在右側可以看到該執行個體在上線階段的QPS變化以及對應發生的事件。

    image

您可以看到,應用先後會出現服務註冊、開始預熱、預熱結束這幾個事件,並且K8s Readines檢查通過的事件也發生在服務註冊事件之後。QPS曲線是在預熱時間長度內(預設 120s)逐步上升到最大值,而不是直接陡升上去。如果您的應用在上線時,事件順序、QPS曲線形狀不符合預期,可以參考FAQ來解決。

說明

樣本圖中的應用, 其K8s就緒檢測已經配置成55199/readiness,並且將最小準備時間(minReadySeconds)配置成120秒,和預設的預熱時間長度一致。

相關文檔

使用YAML配置無損上下線