SpringCloud LoadBalancer自定義負(fù)載均衡器使用解析
由于原有的負(fù)載均衡組件Ribbon停止維護(hù),而完美的Spring生態(tài)怎能允許缺少負(fù)載均衡組件呢?Spring Cloud官方自己造出了Spring Cloud LoadBalancer來代替原有的Ribbon。由于是官方自己寫的組件,所以并沒有像eureka、Feign那樣抽出一個(gè)單獨(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),僅僅作為一個(gè)標(biāo)志性接口。 public interface ReactorServiceInstanceLoadBalancer extends ReactorLoadBalancer<ServiceInstance> // 在Spring Cloud高版本中大部分組件采用了Reacotr框架(有一說一,閱讀性極差?。。? // 這里定義了一個(gè)選擇的抽象方法。 public interface ReactorLoadBalancer<T> extends ReactiveLoadBalancer<T> { Mono<Response<T>> choose(Request request); default Mono<Response<T>> choose() { return choose(REQUEST); } }
這里有涉及到Reactor框架,不過完全可以當(dāng)黑盒使用。接口非常的簡(jiǎn)單就一個(gè)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)作黑盒暫時(shí)不需要去理解。只需要明白從注冊(cè)中心拿到注冊(cè)表以后會(huì)執(zhí)行g(shù)etInstanceResponse方法,只需要實(shí)現(xiàn)自定義負(fù)載均衡策略的邏輯即可,好比我這里的邏輯是永遠(yuǎn)只調(diào)用一個(gè)服務(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方式這個(gè)要復(fù)雜一些,不過大部分都是造輪子,開發(fā)者只需要關(guān)心自定義的負(fù)載均衡邏輯即可~!
到此這篇關(guān)于SpringCloud LoadBalancer自定義負(fù)載均衡器使用解析的文章就介紹到這了,更多相關(guān)SpringCloud LoadBalancer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決java.lang.IllegalStateException:Duplicate key異常問題
java.lang.IllegalStateException:Duplicatekey異常在將List轉(zhuǎn)換為Map時(shí)出現(xiàn),解決方法是使用toMap()的重載方法,如果已經(jīng)存在則不再修改,直接使用上一個(gè)數(shù)據(jù)2025-03-03Mybatis中 mapper-locations和@MapperScan的作用
這篇文章主要介紹了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是掃描Mapper接口對(duì)應(yīng)的XML文件,需要的朋友可以參考下2023-05-05詳解Spring boot/Spring 統(tǒng)一錯(cuò)誤處理方案的使用
這篇文章主要介紹了詳解Spring boot/Spring 統(tǒng)一錯(cuò)誤處理方案的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06SpringBoot如何手寫一個(gè)starter并使用這個(gè)starter詳解
starter是SpringBoot中的一個(gè)新發(fā)明,它有效的降低了項(xiàng)目開發(fā)過程的復(fù)雜程度,對(duì)于簡(jiǎn)化開發(fā)操作有著非常好的效果,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何手寫一個(gè)starter并使用這個(gè)starter的相關(guān)資料,需要的朋友可以參考下2022-12-12Java中instanceof關(guān)鍵字實(shí)例講解
大家好,本篇文章主要講的是Java中instanceof關(guān)鍵字實(shí)例講解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01