您好,登錄后才能下訂單哦!
小編給大家分享一下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è)資訊頻道!
免責聲明:本站發(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)容。