溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud中如何自定義Ribbon負載均衡策略

發(fā)布時間:2021-12-24 16:57:00 來源:億速云 閱讀:285 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下Spring Cloud中如何自定義Ribbon負載均衡策略,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1. 主啟動類處理

還是使用上一節(jié)的客戶端代碼,先回憶一下相關(guān)內(nèi)容:三個訂單服務(wù)提供者,服務(wù)名稱叫:MICROSERVICE-ORDER,端口分別為 8001、8002 和 8003。Eureka 集群三個服務(wù),端口分別為 7001、7002 和 7003。

上一節(jié)主要是使用 Ribbon 的輪詢和隨機策略,來測試負載均衡。這一節(jié)我們自定義一個策略。首先要在啟動類中添加 @RibbonClient 注解,如下:

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "MICROSERVICE-ORDER", configuration = MyRuleConfig.class)
public class OrderConsumer {

   public static void main(String[] args) {
       SpringApplication.run(OrderConsumer.class, args);
   }
}

name 用來指定需要均衡的服務(wù),即三個訂單服務(wù),configuration 用來指定所用的策略配置,這里使用我們自定義的一個配置 MyRuleConfig。接下來,我們來定義這個配置。

2. 自定義配置

這個配置的位置有個地方需要注意:就是所在的包不能和主啟動類在同一個包下面,這是官方文檔提到的注意事項。所以我們自己新建一個和主啟動類所在的包同級的包,然后寫 MyRuleConfig。

/**
* 自定義規(guī)則
* @author shengwu ni
*/
@Configuration
public class MyRuleConfig {
   @Bean
   public IRule myselfRule() {
       // 指定策略:我們自定義的策略
       return new CustomRule();
   }
}

3. 自定義策略

OK,接下來就是實現(xiàn)這個自定義策略:CustomRule了。我們假設(shè)自己定義的策略如下:

還是按照輪詢的方式來選擇服務(wù),但是每個被輪詢到的服務(wù),接下來訪問4次(默認是1次),4次訪問完之后,再切換到下一個服務(wù),訪問4次,以此類推。

拿到這個需求之后,我們需要改寫策略了,根據(jù)官方 github 源碼可以知道,類似于輪詢、隨機這種策略,都是繼承了 AbstractLoadBalancerRule 類,然后重寫 choose 方法。所以,自定義策略分兩步走:


  • 實現(xiàn) AbstractLoadBalancerRule 類

  • 重寫 choose 方法

我先把代碼復制一下,然后來分析一下:

/**
* 自定義規(guī)則
* @author shengwu ni
*/
public class CustomRule extends AbstractLoadBalancerRule {

   /**
    * 總共被調(diào)用的次數(shù),目前要求每臺被調(diào)用4次
     */
   private int total = 0;
   /**
    * 當前提供服務(wù)列表的索引
    */
   private int currentIndex = 0;

   @Override public void initWithNiwsConfig(IClientConfig iClientConfig) {
   }

   /**
    * 在choose方法中,自定義我們自己的規(guī)則,返回的Server就是具體選擇出來的服務(wù)
    * 自己的規(guī)則:按照輪詢的規(guī)則,但是每個被輪詢到的服務(wù)調(diào)用5次。
    * @param o
    * @return
    */
   @Override public Server choose(Object o) {
       // 獲取負載均衡器lb
       ILoadBalancer lb = getLoadBalancer();
       if (lb == null) {
           return null;
       }

       Server server = null;
       while (server == null) {
           if (Thread.interrupted()) {
               return null;
           }
           // 獲取可用服務(wù)列表
           List<Server> upList = lb.getReachableServers();
           // 獲取所有服務(wù)列表
           List<Server> allList = lb.getAllServers();
           int serverCount = allList.size();
           if (serverCount == 0) {
               return null;
           }

           // 若調(diào)用次數(shù)小于4次,一直調(diào)用可用服務(wù)列表中索引為 currentIndex 的服務(wù)
           if(total < 4)
           {
               server = upList.get(currentIndex);
               total++;
           } else {
               // 到了4次之后,服務(wù)列表中的索引值++,表示下一個調(diào)用下一個服務(wù)
               total = 0;
               currentIndex++;
               // 當索引大于可用服務(wù)列表的size時,要重新從頭開始
               currentIndex = currentIndex % upList.size();

               if (server == null) {
                   Thread.yield();
                   continue;
               }

               if (server.isAlive()) {
                   return (server);
               }

               server = null;
               Thread.yield();
           }
       }
       return server;
   }
}

我來簡單分析一下代碼:首先獲取 ILoadBalancer 對象,該對象可以獲取當前的服務(wù)。我們需要獲取當前可用的服務(wù)列表和當前所有的服務(wù)列表。

total 表示服務(wù)被調(diào)用的次數(shù),到4次,該服務(wù)調(diào)用停止,切換到下一個可用服務(wù);currentIndex 表示當前可用服務(wù)列表中的索引。若調(diào)用次數(shù)小于4次,一直調(diào)用可用服務(wù)列表中索引為 currentIndex 的服務(wù),到了4次之后,服務(wù)列表中的索引值++,表示下一個調(diào)用下一個服務(wù)。具體可以看代碼中的注釋。

4. 測試一下

OK,到這里,自定義的負載均衡策略就完成了,我們啟動三個 eureka 集群和三個訂單服務(wù)提供者,然后啟動消費方客戶端(端口9001),然后仍然在瀏覽器輸入:

http://localhost:9001/consumer/order/get/1 來測試一下即可。

正常情況:當前訂單提供服務(wù)會被調(diào)用四次,然后切換到另一個訂單服務(wù),輪流切換。

以上是“Spring Cloud中如何自定義Ribbon負載均衡策略”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI