SpringCloud LoadBalancer自定義負載均衡器使用解析
由于原有的負載均衡組件Ribbon停止維護,而完美的Spring生態(tài)怎能允許缺少負載均衡組件呢?Spring Cloud官方自己造出了Spring Cloud LoadBalancer來代替原有的Ribbon。由于是官方自己寫的組件,所以并沒有像eureka、Feign那樣抽出一個單獨的組件包出來。而放入到Spring Cloud Commons規(guī)范包中。
正文
Spring Cloud LoadBalancer 幫開發(fā)者已經(jīng)實現(xiàn)了RoundRobinLoadBalancer、RandomLoadBalancer,分別是輪訓和隨機,默認實現(xiàn)為輪訓。
即讓是負載均衡組件,那必然有默認實現(xiàn),也必然有擴展接口暴露給開發(fā)者。所以第一步肯定是介紹抽象接口。
// 負載均衡的標志性接口,繼承ReactorLoadBalancer接口
// 本接口無任何接口增強,僅僅作為一個標志性接口。
public interface ReactorServiceInstanceLoadBalancer extends ReactorLoadBalancer<ServiceInstance>
// 在Spring Cloud高版本中大部分組件采用了Reacotr框架(有一說一,閱讀性極差?。。?
// 這里定義了一個選擇的抽象方法。
public interface ReactorLoadBalancer<T> extends ReactiveLoadBalancer<T> {
Mono<Response<T>> choose(Request request);
default Mono<Response<T>> choose() {
return choose(REQUEST);
}
}這里有涉及到Reactor框架,不過完全可以當黑盒使用。接口非常的簡單就一個choose方法,所以接下來我們只需要實現(xiàn)此接口。
@LoadBalancerClient(value = "deptmanagecloud-provider", configuration = MyConfig.class)
public class MyConfig {
// 配置負載均衡策略
@Bean
public ReactorLoadBalancer<ServiceInstance> myLB(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new MyLB(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));
}
}這里有部分邏輯,讀者完全可以當作黑盒暫時不需要去理解。只需要明白從注冊中心拿到注冊表以后會執(zhí)行g(shù)etInstanceResponse方法,只需要實現(xiàn)自定義負載均衡策略的邏輯即可,好比我這里的邏輯是永遠只調(diào)用一個服務(wù)(當然,這完全扯淡,僅僅是Demo無須太關(guān)心)
既然我們把自定義負載均衡策略寫好了,那么,怎么告訴Spring呢?肯定需要注入給Spring。
@LoadBalancerClient(value = "deptmanagecloud-provider", configuration = MyConfig.class)
public class MyConfig {
// 配置負載均衡策略
@Bean
public ReactorLoadBalancer<ServiceInstance> myLB(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new MyLB(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));
}
}這里需要?上@LoadBalancerClient注解,value為調(diào)用方的服務(wù)名,configuration為配置類
總結(jié)
相比以前的Ribbon的IRule方式這個要復(fù)雜一些,不過大部分都是造輪子,開發(fā)者只需要關(guān)心自定義的負載均衡邏輯即可~!
到此這篇關(guān)于SpringCloud LoadBalancer自定義負載均衡器使用解析的文章就介紹到這了,更多相關(guān)SpringCloud LoadBalancer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java畢業(yè)設(shè)計實戰(zhàn)之財務(wù)預(yù)算管理系統(tǒng)的實現(xiàn)
這是一個使用了java+SSM+Jsp+Mysql+Layui+Maven開發(fā)的財務(wù)預(yù)算管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習,具有財務(wù)預(yù)算管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02
Spring Boot2發(fā)布調(diào)用REST服務(wù)實現(xiàn)方法
這篇文章主要介紹了Spring Boot2發(fā)布調(diào)用REST服務(wù)實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
Java中l(wèi)ong類型與Long類型的區(qū)別和大小比較詳解
這篇文章主要給大家介紹了Java中l(wèi)ong類型與Long類型區(qū)別和大小比較的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-11-11
springboot的切面應(yīng)用方式(注解Aspect)
文章總結(jié):Spring?Boot提供了三種攔截器:Filter、Interceptor和Aspect,Filter主要用于內(nèi)容過濾和非登錄狀態(tài)的非法請求過濾,無法獲取Spring框架相關(guān)的信息,Interceptor可以在獲取請求類名、方法名的同時,獲取請求參數(shù),但無法獲取參數(shù)值2024-11-11

