Spring Cloud Ribbon 中的 7 種負載均衡策略
負載均衡通器常有兩種實現手段,一種是服務端負載均衡器,另一種是客戶端負載均衡器,而我們今天的主角 Ribbon 就屬於後者——客戶端負載均衡器。
服務端負載均衡器的問題是,它提供了更強的流量控制權,但無法滿足不同的消費者希望使用不同負載均衡策略的需求,而使用不同負載均衡策略的場景確實是存在的,所以客戶端負載均衡就提供了這種靈活性。 然而客戶端負載均衡也有其缺點,如果配置不當,可能會導致服務提供者出現熱點,或者壓根就拿不到任何服務的情況,所以我們本文就來了解一下這 7 種內建負載均衡策略的具體規則。
Ribbon 介紹
Ribbon 是 Spring Cloud 技術棧中非常重要的基礎框架,它為 Spring Cloud 提供了負載均衡的能力,比如 Fegin 和 OpenFegin 都是基於 Ribbon 實現的,就連 Nacos 中的負載均衡也使用了 Ribbon 框架。
Ribbon 框架的強大之處在於,它不僅內建了 7 種負載均衡策略,同時還支援使用者自定義負載均衡策略,所以其開放性和便利性也是它得以流行的主要原因。
服務端負載均衡器和客戶端負載均衡器的區別如下圖所示:
客戶端負載均衡器的實現原理是通過註冊中心,如 Nacos,將可用的服務列表拉取到本地(客戶端),再通過客戶端負載均衡器(設定的負載均衡策略)獲取到某個伺服器的具體 ip 和埠,然後再通過 Http 框架請求服務並得到結果,其執行流程如下圖所示:
負載均衡設定
以 Nacos 中的 Ribbon 負載均衡設定為例,在配置檔案 application.yml 中設定如下配置即可:
springcloud-nacos-provider: # nacos中的服務id ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #設定負載均衡策略
因為 Nacos 中已經內建了 Ribbon,所以在實際專案開發中無需再新增 Ribbon 依賴了,這一點我們在 Nacos 的依賴樹中就可以看到,如下圖所示:
Ribbon 預設的負載均衡策略是輪詢模式,我們配置 3 個服務提供者的執行結果如下圖所示:
然後,我們再將 Ribbon 負載均衡策略設定為隨機模式,配置內容如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #設定隨機負載均衡
重啟客戶端,執行結果如下圖所示:
7種負載均衡策略
1.輪詢策略
輪詢策略:RoundRobinRule,按照一定的順序依次呼叫服務例項。比如一共有 3 個服務,第一次呼叫服務 1,第二次呼叫服務 2,第三次呼叫服務3,依次類推。
此策略的配置設定如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #設定負載均衡
2.權重策略
權重策略:WeightedResponseTimeRule,根據每個服務提供者的響應時間分配一個權重,響應時間越長,權重越小,被選中的可能性也就越低。
它的實現原理是,剛開始使用輪詢策略並開啟一個計時器,每一段時間收集一次所有服務提供者的平均響應時間,然後再給每個服務提供者附上一個權重,權重越高被選中的概率也越大。
此策略的配置設定如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
3.隨機策略
隨機策略:RandomRule,從服務提供者的列表中隨機選擇一個服務例項。
此策略的配置設定如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #設定負載均衡
4.最小連線數策略
最小連線數策略:BestAvailableRule,也叫最小併發數策略,它是遍歷服務提供者列表,選取連線數最小的⼀個服務例項。如果有相同的最小連線數,那麼會呼叫輪詢策略進行選取。
此策略的配置設定如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #設定負載均衡
5.重試策略
重試策略:RetryRule,按照輪詢策略來獲取服務,如果獲取的服務例項為 null 或已經失效,則在指定的時間之內不斷地進行重試來獲取服務,如果超過指定時間依然沒獲取到服務例項則返回 null。
此策略的配置設定如下:
ribbon:
ConnectTimeout: 2000 # 請求連線的超時時間
ReadTimeout: 5000 # 請求處理的超時時間
springcloud-nacos-provider: # nacos 中的服務 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #設定負載均衡
6.可用性敏感策略
可用敏感性策略:AvailabilityFilteringRule,先過濾掉非健康的服務例項,然後再選擇連線數較小的服務例項。
此策略的配置設定如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule
7.區域敏感策略
區域敏感策略:ZoneAvoidanceRule,根據服務所在區域(zone)的效能和服務的可用性來選擇服務例項,在沒有區域的環境下,該策略和輪詢策略類似。
此策略的配置設定如下:
springcloud-nacos-provider: # nacos中的服務id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
專案原始碼
https://gitee.com/mydb/spring-cloud-alibaba-example
總結
Ribbon 為客戶端負載均衡器,相比於服務端負載均衡器的統一負載均衡策略來說,它提供了更多的靈活性。Ribbon 內建了 7 種負載均衡策略:輪詢策略、權重策略、隨機策略、最小連線數策略、重試策略、可用性敏感策略、區域性敏感策略,並且使用者可以通過繼承 RoundRibbonRule 來實現自定義負載均衡策略。
是非審之於己,譭譽聽之於人,得失安之於數。
公眾號:Java中文社群
Java面試合集:https://gitee.com/mydb/interview