對于任何一個線上應用,在服務更新部署等過程中,需要盡量保證客戶端無感知,即從應用停止到重啟恢復服務這個階段不能影響正常的業務請求。在應用執行部署、停止、回滾、縮容和重置時,需要通過無損下線配置來保證應用正常關閉。本文介紹使用無損下線的注意事項、使用優勢以及如何在控制臺使用無損下線功能。
為什么需要無損下線
由于微服務應用自身調用特點,在高并發下,服務提供端應用實例的直接下線,會導致服務消費端應用實例無法實時感知下游提供者實例的實時狀態,因而出現繼續將請求轉發到已下線的實例,從而出現請求報錯,流量有損。
無損下線實現方案
提供者A在下線時,雖然會主動通知到注冊中心,但此時消費者B可能無法實時感知到,導致消費者B繼續調用已下線的提供者A。為了避免這種情況的發生,在提供者A接到下線命令即將下線前,對于在等待下線階段收到的請求,在其返回值中都增加上特殊標記,讓消費者B接收到返回值并識別到相關標志后主動拉取一次注冊中心服務實例,從而實時感知提供者A最新狀態,從而達到提供者A的下線狀態能夠被消費者B實時感知。此外,提供者A在下線時,還會等待一定的時間,以保證下線時已經收到的在途請求都被執行完畢,避免這些請求未被執行完畢,提供者A就已經停機。
當前應用只需要接入MSE,就會默認開啟無損下線功能,但無損下線主動通知功能需要手動配置。同時MSE無損上下線功能提供可觀測能力,幫助您判斷應用是否無損下線成功。
無損下線觀測
應用接入無損下線之后,在應用實例下線時,可以在應用治理界面觀測到,下線實例的流量在很短時間內被清空,QPS數據很快降為0。
登錄MSE治理中心控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇 ,然后單擊目標應用的資源量卡片。
在目標應用詳情頁面的左側導航欄,單擊流量治理,然后選擇無損上下線頁簽。
在上下線概覽處,可以看到最近一段時間內,該應用上下線過程中的發生的事件。在左側上下線實例中找到想要查看的下線實例,單擊該實例,可以在右側看到,該實例在下線時執行了“無損下線”流程,并且在執行完該流程后,流量會被快速清空,一直到實例“停機”之前,已經不再有流量進入。
如果觀測到無損下線成功事件產生之后,QPS數據沒有快速降為0,可以先確認是否存在本地調用等非來自于微服務請求調用的流量。
當 Agent 版本在 4.2.0 后才會上報“應用停機”事件,如果您未觀測到該事件,可以考慮升級您的 Agent 版本。
如何開啟主動通知
什么是主動通知
主動通知是無損下線功能模塊提供的一個進階功能,默認關閉。一般情況下,MSE無損上下線提供的下線方案已經可以解決大部分場景下的問題。而當,待下線應用使用Spring Cloud框架時,在應用下線時發現有消費者調用出錯的情況,可以嘗試開啟該功能來解決。開啟后,提供者實例在下線階段將會主動通知服務消費者,通知后,服務消費者將不再請求該提供者實例。
前提條件
注意事項
MSE治理中心暫不支持如下應用無損下線:
暫不支持非Java應用體系的無損下線。
暫不支持非WebFlux或SpringMVC應用的無損下線。
暫不支持消費端為非微服務應用的下游提供者應用的無損下線。
需要消費者端和提供端應用都接入MSE微服務治理,才能實現應用無損下線。
由于無損下線流程中需要等待一定的時間來保證下線示例在途中的請求都能執行完畢,K8s容器中的terminationGracePeriodSeconds
參數值(默認值 30)需要大于30,建議配置為90。如果您使用默認的30,可能會存在應用shutdownhook
無法正常執行完畢的情況,從而導致應用停機時一些資源無法正常關閉。
開啟無損下線主動通知
登錄MSE治理中心控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇 ,然后單擊目標應用的資源量卡片。
在目標應用詳情頁面的左側導航欄,單擊流量治理,然后選擇無損上下線頁簽。
在配置信息模塊,單擊修改,然后單擊無損下線折疊塊,打開主動通知按鈕,然后單擊確定。