逅弈 轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!
系列文章
Sentinel 原理-全解析
Sentinel 原理-調(diào)用鏈
Sentinel 原理-滑動(dòng)窗口
Sentinel 原理-實(shí)體類
Sentinel 實(shí)戰(zhàn)-限流篇
Sentinel 實(shí)戰(zhàn)-控制臺(tái)篇
Sentinel 實(shí)戰(zhàn)-規(guī)則持久化
Sentinel 實(shí)戰(zhàn)-集群限流環(huán)境搭建(詳細(xì)圖文描述)
Sentinel 系列教程,現(xiàn)已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all_4_you/sentinel-tutorial

集群流控
我們已經(jīng)知道如何為應(yīng)用接入限流了,但是到目前為止,這些還只是在單機(jī)應(yīng)用中生效。也就是說(shuō),假如你的應(yīng)用有多個(gè)實(shí)例,那么你設(shè)置了限流的規(guī)則之后,每一臺(tái)應(yīng)用的實(shí)例都會(huì)生效相同的流控規(guī)則,如下圖所示:

假設(shè)我們?cè)O(shè)置了一個(gè)流控規(guī)則,qps是10,那么就會(huì)出現(xiàn)如上圖所示的情況,當(dāng)qps大于10時(shí),實(shí)例中的 sentinel 就開始生效了,就會(huì)將超過(guò)閾值的請(qǐng)求 block 掉。
上圖好像沒(méi)什么問(wèn)題,但是細(xì)想一下,我們可以發(fā)現(xiàn)還是會(huì)有這樣的問(wèn)題:
- 假設(shè)集群中有 10 臺(tái)機(jī)器,我們給每臺(tái)機(jī)器設(shè)置單機(jī)限流閾值為 10 qps,理想情況下整個(gè)集群的限流閾值就為 100 qps。不過(guò)實(shí)際情況下路由到每臺(tái)機(jī)器的流量可能會(huì)不均勻,會(huì)導(dǎo)致總量沒(méi)有到的情況下某些機(jī)器就開始限流。
- 每臺(tái)單機(jī)實(shí)例只關(guān)心自己的閾值,對(duì)于整個(gè)系統(tǒng)的全局閾值大家都漠不關(guān)心,當(dāng)我們希望為某個(gè) api 設(shè)置一個(gè)總的 qps 時(shí)(就跟為 api 設(shè)置總的調(diào)用次數(shù)一樣),那這種單機(jī)模式的限流就無(wú)法滿足條件了。
基于種種這些問(wèn)題,我們需要?jiǎng)?chuàng)建一種集群限流的模式,這時(shí)候我們很自然地就想到,可以找一個(gè) server 來(lái)專門統(tǒng)計(jì)總的調(diào)用量,其它的實(shí)例都與這臺(tái) server 通信來(lái)判斷是否可以調(diào)用。這就是最基礎(chǔ)的集群流控的方式。
原理
集群限流的原理很簡(jiǎn)單,和單機(jī)限流一樣,都需要對(duì) qps 等數(shù)據(jù)進(jìn)行統(tǒng)計(jì),區(qū)別就在于單機(jī)版是在每個(gè)實(shí)例中進(jìn)行統(tǒng)計(jì),而集群版是有一個(gè)專門的實(shí)例進(jìn)行統(tǒng)計(jì)。
這個(gè)專門的用來(lái)統(tǒng)計(jì)數(shù)據(jù)的稱為 Sentinel 的 token server,其他的實(shí)例作為 Sentinel 的 token client 會(huì)向 token server 去請(qǐng)求 token,如果能獲取到 token,則說(shuō)明當(dāng)前的 qps 還未達(dá)到總的閾值,否則就說(shuō)明已經(jīng)達(dá)到集群的總閾值,當(dāng)前實(shí)例需要被 block,如下圖所示:

集群流控是在 Sentinel 1.4 的版本中提供的新功能,和單機(jī)流控相比,集群流控中共有兩種身份:
- token client:集群流控客戶端,用于向所屬 token server 通信請(qǐng)求 token。集群限流服務(wù)端會(huì)返回給客戶端結(jié)果,決定是否限流。
- token server:即集群流控服務(wù)端,處理來(lái)自 token client 的請(qǐng)求,根據(jù)配置的集群規(guī)則判斷是否應(yīng)該發(fā)放 token(是否允許通過(guò))。
而單機(jī)流控中只有一種身份,每個(gè) sentinel 都是一個(gè) token server。
需要注意的是,集群限流中的 token server 是單點(diǎn)的,一旦 token server 掛掉,那么集群限流就會(huì)退化成單機(jī)限流的模式。在 ClusterFlowConfig 中有一個(gè)參數(shù) fallbackToLocalWhenFail 就是用來(lái)確定當(dāng) client 連接失敗或通信失敗時(shí),是否退化到本地的限流模式的。
Sentinel 集群流控支持限流規(guī)則和熱點(diǎn)規(guī)則兩種規(guī)則,并支持兩種形式的閾值計(jì)算方式:
- 集群總體模式:即限制整個(gè)集群內(nèi)的某個(gè)資源的總體 qps 不超過(guò)此閾值。
- 單機(jī)均攤模式:?jiǎn)螜C(jī)均攤模式下配置的閾值等同于單機(jī)能夠承受的限額,token server 會(huì)根據(jù)連接數(shù)來(lái)計(jì)算總的閾值(比如獨(dú)立模式下有 3 個(gè) client 連接到了 token server,然后配的單機(jī)均攤閾值為 10,則計(jì)算出的集群總量就為 30),按照計(jì)算出的總的閾值來(lái)進(jìn)行限制。這種方式根據(jù)當(dāng)前的連接數(shù)實(shí)時(shí)計(jì)算總的閾值,對(duì)于機(jī)器經(jīng)常進(jìn)行變更的環(huán)境非常適合。
部署方式
token server 有兩種部署方式:
- 一種是獨(dú)立部署,就是單獨(dú)啟動(dòng)一個(gè) token server 服務(wù)來(lái)處理 token client 的請(qǐng)求,如下圖所示:

如果獨(dú)立部署的 token server 服務(wù)掛掉的話,那其他的 token client 就會(huì)退化成本地流控的模式,也就是單機(jī)版的流控,所以這種方式的集群限流需要保證 token server 的高可用性。
- 一種是嵌入部署,就是在多個(gè) sentinel-core 中選擇一個(gè)實(shí)例設(shè)置為 token server,隨著應(yīng)用一起啟動(dòng),其他的 sentinel-core 都是集群中 token client,如下圖所示:

嵌入式部署的模式中,如果 token server 服務(wù)掛掉的話,我們可以將另外一個(gè) token client 升級(jí)為token server來(lái),當(dāng)然啦如果我們不想使用當(dāng)前的 token server 的話,也可以選擇另外一個(gè) token client 來(lái)承擔(dān)這個(gè)責(zé)任,并且將當(dāng)前 token server 切換為 token client。Sentinel 為我們提供了一個(gè) api 來(lái)進(jìn)行 token server 與 token client 的切換:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server,-1 代表關(guān)閉。
PS:注意應(yīng)用端需要引入集群限流客戶端或服務(wù)端的相應(yīng)依賴。
如何使用
請(qǐng)前往 Sentinel 集群限流環(huán)境搭建(詳細(xì)圖文描述) 查看具體步驟
注意事項(xiàng)
集群流控能夠精確地控制整個(gè)集群的 qps,結(jié)合單機(jī)限流兜底,可以更好地發(fā)揮流量控制的效果。
還有更多的場(chǎng)景等待大家發(fā)掘,比如:
- 在 API Gateway 處統(tǒng)計(jì)某個(gè) api 的總訪問(wèn)量,并對(duì)某個(gè) api 或服務(wù)的總 qps 進(jìn)行限制
- Service Mesh 中對(duì)服務(wù)間的調(diào)用進(jìn)行全局流控
- 集群內(nèi)對(duì)熱點(diǎn)商品的總訪問(wèn)頻次進(jìn)行限制
盡管集群流控比較好用,但它不是萬(wàn)能的,只有在確實(shí)有必要的場(chǎng)景下才推薦使用集群流控。
另外若在生產(chǎn)環(huán)境使用集群限流,管控端還需要關(guān)注以下的問(wèn)題:
- Token Server 自動(dòng)管理(分配/選舉 Token Server)
- Token Server 高可用,在某個(gè) server 不可用時(shí)自動(dòng) failover 到其它機(jī)器
