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

