全部產品
Search
文件中心

Microservices Engine:無損下線

更新時間:Jun 05, 2025

對於任何一個線上應用,在服務更新部署等過程中,需要盡量保證用戶端無感知,即從應用停止到重啟恢複服務這個階段不能影響正常的業務請求。在應用執行部署、停止、復原、縮容和重設時,需要通過無損下線配置來保證應用正常關閉。本文介紹使用無損下線的注意事項、使用優勢以及如何在控制台使用無損下線功能。

為什麼需要無損下線

由於微服務應用自身調用特點,在高並發下,服務提供端應用執行個體的直接下線,會導致服務消費端應用執行個體無法即時感知下遊提供者執行個體的即時狀態,因而出現繼續將請求轉寄到已下線的執行個體,從而出現請求報錯,流量有損。

無損下線實現方案

提供者A在下線時,雖然會主動通知到註冊中心,但此時消費者B可能無法即時感知到,導致消費者B繼續調用已下線的提供者A。為了避免這種情況的發生,在提供者A接到下線命令即將下線前,對於在等待下線階段收到的請求,在其傳回值中都增加上特殊標記,讓消費者B接收到傳回值並識別到相關標誌後主動拉取一次註冊中心服務執行個體,從而即時感知提供者A最新狀態,從而達到提供者A的下線狀態能夠被消費者B即時感知。此外,提供者A在下線時,還會等待一定的時間,以保證下線時已經收到的在途請求都被執行完畢,避免這些請求未被執行完畢,提供者A就已經停機。

說明

當前應用只需要接入MSE,就會預設開啟無損下線功能,但無損下線主動通知功能需要手動設定。同時MSE無損上下線功能提供可觀測能力,協助您判斷應用是否無損下線成功。

在 K8s 環境中接入 MSE 服務治理無損下線時,無損下線相關的操作會以lifecycle.preStop的形式注入到 Pod 中,並在 Pod 停機前得以執行,因此不建議您配置自訂的preStop。如果您的preStop中的行為是進行微服務註冊中心下線,那麼完全可以將其刪除,並且使用無損下線自動注入的preStop來實現這一需求。

如果您確實有一些業務上的優雅停機操作,並且已經為業務容器配置上了您自訂的preStop,那麼無損下線preStop不再進行注入到您的業務容器中。相應地,無損下線會注入一個名字為gracefulshutdown的sidecar容器,並為該容器注入無損下線preStop,通過sidecar預設與業務容器共用網路命名空間的機制,在 Pod 停止前執行sidecar的preStop也能實現業務容器的無損下線。

為了確保sidecar的preStop能夠順利執行完畢,您在業務容器自訂的preStop中,至少有 30 秒的 sleep 時間,保證在途請求被執行完畢。

說明
  • sidecar 容器的資源消耗極低,目前配置為:CPU: 50m,Memory: 50Mi。

  • 由於無損下線在 K8s 情境下是基於 preStop 來實現的,目前只能支援 pod 正常停機情境的無損下線(如:縮容、重啟、滾動升級等),不支援異常停機情境的無損下線(如:OOM kill)。

如何開啟無損下線

  • 如果您的應用部署在阿里雲Container Service ACK 環境下,在接入 MSE 服務治理後,無需額外執行開啟無損下線的操作,無損下線功能預設會自動開啟。

  • 如果您的應用部署在阿里雲 ECS 環境下,那麼需要您在應用的停機指令碼,加入下面的內容,並在指令碼運行階段靠前優先執行。

    curl http://127.0.0.1:54199/offline 2>/tmp/null; sleep 30;

無損下線觀測

應用接入無損下線之後,在應用執行個體下線時,可以在應用治理介面觀測到,下線執行個體的流量在很短時間內被清空,QPS資料很快降為0。

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

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

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

上下線概覽處,可以看到最近一段時間內,該應用上下線過程中的發生的事件。在左側上下線執行個體中找到想要查看的下線執行個體,單擊該執行個體,可以在右側看到,該執行個體在下線時執行了“無損下線”流程,並且在執行完該流程後,流量會被快速清空,一直到執行個體“停機”之前,已經不再有流量進入。

image

重要
  • 如果觀測到無損下線成功事件產生之後,QPS資料沒有快速降為0,可以先確認是否存在本地調用等非來自於微服務要求調用的流量。

  • 當探針版本在 4.2.0 後才會上報“應用停機”事件,如果您未觀測到該事件,可以考慮升級您的探針版本。

如何開啟主動通知

什麼是主動通知

主動通知是無損下線功能模組提供的一個進階功能,預設關閉。一般情況下,MSE無損上下線提供的下線方案已經可以解決大部分情境下的問題。而當,待下線應用使用Spring Cloud架構時,在應用下線時發現有消費者調用出錯的情況,可以嘗試開啟該功能來解決。開啟後,提供者執行個體在下線階段將會主動通知服務消費者,通知後,服務消費者將不再請求該提供者執行個體。

前提條件

注意事項

MSE治理中心暫不支援如下應用無損下線:

  • 暫不支援非Java應用體系的無損下線。

  • 暫不支援非WebFlux或SpringMVC應用的無損下線。

  • 暫不支援消費端為非微服務應用的下遊提供者應用的無損下線。

  • 需要消費者端和提供端應用都接入MSE微服務治理,才能實現應用無損下線。

說明

由於無損下線流程中需要等待一定的時間來保證下線樣本在途中的請求都能執行完畢,K8s容器中的terminationGracePeriodSeconds 參數值(預設值 30)需要大於30,建議配置為90。如果您使用預設的30,可能會存在應用shutdownhook無法正常執行完畢的情況,從而導致應用停機時一些資源無法正常關閉。

開啟無損下線主動通知

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

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

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

  4. 配置資訊模組,單擊修改,然後單擊無損下線摺疊塊,開啟主動通知按鈕,然後單擊確定

相關文檔