<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡述SpringCloud Ribbon中的7種負載均衡策略

jf_78858299 ? 來源:Java中文社群 ? 作者:磊哥 ? 2023-05-11 17:32 ? 次閱讀

負載均衡通器常有兩種實現手段,一種是服務端負載均衡器,另一種是客戶端負載均衡器,而我們今天的主角 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 來實現自定義負載均衡策略。

阿Q說代碼專注于后端技術棧分享:文章風格多變、配圖通俗易懂、故事生動有趣

90篇原創內容

公眾號

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    333

    瀏覽量

    14181
  • 負載均衡器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    2556
收藏 人收藏

    評論

    相關推薦

    路由器負載均衡怎么配置

    。 一、負載均衡的實現方式 基于路由協議的負載均衡:這種方式主要利用不同的路由協議,如OSPF、BGP等,根據路由協議的算法和策略,將流量分
    的頭像 發表于 12-13 11:17 ?1581次閱讀

    SpringCloud微服務架構01-13-Ribbon-負載均衡策略

    spring
    電子學習
    發布于 :2023年01月08日 18:01:47

    電池管理系統均衡及管理策略

    各設計了一簡單的的控制策略,供大家學習理解之用。被動型均衡被動型均衡原理:被動均衡又稱有損均衡
    發表于 04-07 10:43

    結構化P2P自適應混合負載均衡策略

    本文在深入研究已有負載均衡策略的基礎上,提出了一種建立在結構化P2P 上基于Chord 的自適應高可用性混合負載均衡
    發表于 08-14 16:25 ?17次下載

    基于應用層負載均衡策略的分析

    基于應用層負載均衡策略的分析
    發表于 03-26 08:28 ?8次下載

    雙機熱備與負載均衡的設計與實現

    針對OpenFlow SDN系統中的策略管理模塊提出了一種新型的雙機熱備和負載均衡方案,采用了服務器集群的方式,通過Keepalived和Heartbeat實現了雙機熱備模塊,通過Nginx實現了代理服務器和
    發表于 12-24 17:57 ?10次下載

    HBase負載均衡分析及優化策略

    HBase負載均衡分析及優化策略_黃偉建
    發表于 01-03 17:41 ?0次下載

    面向軟件即服務的負載均衡策略建模與分析

    為提高軟件即服務( SaaS)應用中資源的訪問效率,提出支持SaaS服務重要特征的負載均衡策略。首先,結合SaaS服務的多租戶和高度可伸縮兩大特性,提出一種基于租戶請求分流、在局部和全局兩個層次伸縮
    發表于 12-07 14:14 ?0次下載

    基于數據熱點的MongoDB負載均衡策略

    MongoDB作為一種新興的NoSQL數據庫,以其模式自由、文檔式存儲、故障自動恢復、良好的水平擴展、自動負載均衡等特點深受國內外市場的青睞.MongoDB自帶的負載均衡
    發表于 01-04 15:31 ?0次下載
    基于數據熱點的MongoDB<b class='flag-5'>負載</b><b class='flag-5'>均衡</b><b class='flag-5'>策略</b>

    基于負載轉移的節點帶寬資源均衡策略

    針對采用了網絡編碼技術的對等網( P2P)流媒體系統應用,提出一種基于負載轉移的節點帶寬資源均衡策略,盡可能避免節點選擇鄰居節點并請求帶寬資源的隨意性形成的節點過載。在策略中,當某些節
    發表于 01-08 16:42 ?0次下載
    基于<b class='flag-5'>負載</b>轉移的節點帶寬資源<b class='flag-5'>均衡</b><b class='flag-5'>策略</b>

    面向云服務的分布式消息系統動態負載均衡策略

    針對云服務下分布式消息系統存在的節點間負載傾斜問題,提岀基于副本角色的動態負載均衡策略,并將算法應用于Apache Kafka分布式流平臺中?;谙⑾到y的主要功能為讀寫及存儲消息,算
    發表于 06-17 10:35 ?12次下載

    解密負載均衡技術和負載均衡算法

    負載均衡器是一種軟件或硬件設備,它起到了將網絡流量分散到一組服務器的作用,可以防止任何一臺服務器過載。負載均衡算法就是負載
    的頭像 發表于 11-12 09:16 ?859次閱讀

    Nacos、OpenFeign、Ribbon組件協調工作的原理

    ? ? Nacos 如何進行服務自動注冊? Ribbon OpenFeign 總結 前幾天有個大兄弟問了我一個問題,注冊中心要集成SpringCloud,想實現SpringCloud負載
    的頭像 發表于 05-22 10:46 ?399次閱讀
    Nacos、OpenFeign、<b class='flag-5'>Ribbon</b>組件協調工作的原理

    負載均衡策略有哪些? 負載均衡的三種方式?

    負載均衡策略有哪些? 負載均衡策略有如下: 輪詢(Round Robin):按照請求的順序輪
    的頭像 發表于 07-25 14:13 ?1492次閱讀

    如何確定適合的負載均衡比例

    其影響以及相關策略。 什么是負載均衡比例? 在網絡中,路由器通常連接著多個網絡設備和服務器。當網絡流量過大時,使用單個設備處理這些數據可能會導致性能下降或網絡擁塞。為了解決這個問題,負載
    的頭像 發表于 12-15 10:36 ?627次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>