Spring Cloud Alibaba Nacos路由策略之保護(hù)閾值!
作者 | 磊哥
來源 | Java中文社群(ID:javacn666)
轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)
在 Nacos 的路由策略中有 3 個比較重要的內(nèi)容:權(quán)重、保護(hù)閾值和就近訪問。因?yàn)檫@ 3 個內(nèi)容都是彼此獨(dú)立的,所以今天我們就單獨(dú)拎出“保護(hù)閾值”來詳細(xì)聊聊。
保護(hù)閾值
保護(hù)閾值(ProtectThreshold):為了防止因過多實(shí)例故障,導(dǎo)致所有流量全部流入剩余健康實(shí)例,繼而造成流量壓力將剩余健康實(shí)例被壓垮形成雪崩效應(yīng)。應(yīng)將健康保護(hù)閾值定義為?個 0 到 1 之間的浮點(diǎn)數(shù)。當(dāng)域名健康實(shí)例數(shù)占總服務(wù)實(shí)例數(shù)的比例小于該值時(shí),無論實(shí)例是否健康,都會將這個(健康或不健康的)實(shí)例返回給客戶端。這樣做雖然損失了?部分流量,但是保證了集群中剩余健康實(shí)例能正常工作。
也就是說,保護(hù)閾值是設(shè)置集群中健康實(shí)例占比允許的最小值,它需要設(shè)置一個 0-1 的浮點(diǎn)值,默認(rèn)值為 0,當(dāng)集群中的健康實(shí)例占比小于設(shè)置的保護(hù)閾值時(shí),就會觸發(fā)閾值保護(hù)功能。保護(hù)閾值可在服務(wù)詳情中查詢和設(shè)置,如下圖所示:
如何理解保護(hù)閾值?
要理解保護(hù)閾值先要明確一個前提條件:對于 Nacos 的注冊中心功能來說,Nacos 有一個天然的職責(zé),是將服務(wù)消費(fèi)者(Consumer)的請求轉(zhuǎn)發(fā)給某個健康的服務(wù)提供者(Provider)。但在執(zhí)行的流程中,可能會出現(xiàn)一種極端的情況,比如某個服務(wù)有 100 個實(shí)例,其中 99 個實(shí)例都宕機(jī)了,只剩下一個健康的實(shí)例,這個時(shí)候如果把所有的請求都轉(zhuǎn)發(fā)到這一個健康實(shí)例上就會造成雪崩效應(yīng),最終導(dǎo)致業(yè)務(wù)系統(tǒng)崩潰。為了防止這種極端情況,于是就有了“保護(hù)閾值”,保護(hù)閾值一旦被觸發(fā),那么 Nacos 將會把請求轉(zhuǎn)發(fā)給所有服務(wù)實(shí)例,也就是健康實(shí)例+非健康實(shí)例,這樣可能會損失了?部分流量,但能保證集群中剩余的健康實(shí)例能正常工作。
保護(hù)閾值觸發(fā)條件:(實(shí)際健康實(shí)例/總服務(wù)實(shí)例)≤設(shè)置的保護(hù)閾值
設(shè)置保護(hù)閾值
我們可以通過“編輯服務(wù)”來設(shè)置保護(hù)閾值,如下圖所示:
觸發(fā)保護(hù)閾值
接下來我們創(chuàng)建一個服務(wù)測試一下保護(hù)閾值的功能,在創(chuàng)建的服務(wù)中添加兩個實(shí)例,如下圖所示:
默認(rèn)情況下服務(wù)實(shí)例都是健康的,接下來我們將保護(hù)閾值設(shè)置為 0.8,也就是健康實(shí)例的最低要求是 80%,如果健康實(shí)例占比小于此值就會觸發(fā)保護(hù)閾值,如下圖所示:
當(dāng)所有節(jié)點(diǎn)都健康時(shí),觀察服務(wù)列表頁面,可以看出并未觸發(fā)保護(hù)閾值的功能,如下圖所示:
此時(shí)我們手動停止一個服務(wù)實(shí)例,如下圖所示:
這是健康實(shí)例的占比就從 100%,下降到了 50%,小于了設(shè)置的保護(hù)閾值
0.8(80%),接下來返回服務(wù)列表頁面,可以看到保護(hù)閾值功能被觸發(fā)了:
此時(shí),我們再去訪問服務(wù)就會看到,部分請求會轉(zhuǎn)發(fā)到非健康實(shí)例,也就是訪問會出錯,如下圖所示:
未觸發(fā)保護(hù)閾值
接下來我們降低保護(hù)閾值,將保護(hù)閾值設(shè)置為 0.3,也就是健康實(shí)例占比最低要求是 30%,否則會觸發(fā)閾值保護(hù),如下圖所示:
而此時(shí)因?yàn)槲覀兘】祵?shí)例占比是 50%,大于設(shè)置的閾值保護(hù) 0.3,所以就不會觸發(fā)閾值保護(hù),這點(diǎn)可以在服務(wù)列表中觀察到:
當(dāng)未觸發(fā)保護(hù)閾值時(shí),Nacos 會把所有請求都轉(zhuǎn)發(fā)到健康的實(shí)例上,所以每次都能正常的訪問服務(wù),執(zhí)行效果如下圖所示:
總結(jié)
保護(hù)閾值是為了防止因過多實(shí)例故障,導(dǎo)致所有流量全部流入剩余健康實(shí)例,繼而造成流量壓力將剩余健康實(shí)例被壓垮形成雪崩效應(yīng)。它的默認(rèn)值是 0,取值范圍應(yīng)該是 0-1 的浮點(diǎn)數(shù)。此值是定義集群中允許健康實(shí)例占比的最小值,如果實(shí)際健康服務(wù)占比小于或等于此值,就會觸發(fā)保護(hù)閾值,那么 Nacos 就會將全部實(shí)例:健康實(shí)例 + 非健康實(shí)例全部返回給調(diào)用者,而當(dāng)保護(hù)閾值未觸發(fā)時(shí),Nacos 只會把健康實(shí)例返回給調(diào)用者。