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