Spring cloud alibaba之Ribbon負載均衡實現(xiàn)方案
1.什么是Ribbon
目前主流的負載均衡方案分為以下兩種:
(1)集中式負載均衡:在消費者和服務(wù)提供者中間使用獨立的代理方式進行負載,有硬件的(F5),軟件的Nginx
(2)客戶端事先拿到提供者請求連接集合,根據(jù)自己的請求情況做負載均衡,Ribbon就屬于客戶端自己做負載均衡。
Spring cloud Ribbon是基于Netflix Ribbon實現(xiàn)的一套客戶端的負載均衡工具,Ribbon客戶端提供一系列完善的配置,如超時、重試等。通過Load Balancer獲取到服務(wù)器提供的所有機器實例,Ribbon會自動基于某種規(guī)則(輪詢、隨機)去調(diào)用這些服務(wù)。Ribbon也可以實現(xiàn)自己的負載均衡算法。
1.1客戶端的負載均衡
例如spring cloud中的Ribbon,客戶端會有一個服務(wù)器地址列表,在發(fā)送請求前通過負載均衡算法選擇一個服務(wù)器,然后進行訪問,這是客戶端負載均衡,即在客戶端進行負載均衡算法分配。
1.2服務(wù)器端的負載均衡
例如通過Nginx進行負載均衡,先發(fā)送請求,然后通過負載均衡算法,在多個服務(wù)器之間選擇一個進行訪問;即在服務(wù)器端進行負載均衡算法分配。
1.3常見負載均衡算法
(1)隨機:通過隨機選擇服務(wù)進行執(zhí)行,一般這種方法使用較少
(2)輪詢:負載均衡默認實現(xiàn)方式,請求來之后排隊處理
(3)加權(quán)輪詢:通過對服務(wù)器性能的分型,給高配置、低負載的服務(wù)器分配更高的權(quán)重,均衡各個服務(wù)器的壓力
(4)地址Hash,通過客戶端地址請求地址的hash值取模映射進行調(diào)度,
(5)最小鏈接數(shù):即使請求均衡了,壓力不一定會均衡,最小鏈接數(shù)法就是根據(jù)服務(wù)器的情況,例如請求積壓數(shù)的參數(shù),將請求分配到當前壓力最小的服務(wù)器上
2.Nacos使用Ribbon
(1)Nacos disconvery中默認已經(jīng)引入了Ribbon,不需要單獨引入
(2)添加@LoadBalanced注解
(3)調(diào)用的時候使用服務(wù)器名稱替代ip+端口,即使用默認輪詢的負載均衡方式
3.Ribbon負載均衡策略
3.1常用負載均衡描述
①RandomRule:隨機選擇一個服務(wù)實例
②RoundRobinRule:輪詢負載均衡策略
③RetryTule:在輪詢的基礎(chǔ)上進行重試,一直重試的次數(shù)由服務(wù)連接的超時時間控制
④WeightedResponseTimeRule:一個服務(wù)的平均響應(yīng)時間越短,則權(quán)重越大,那么改實例被選中執(zhí)行任務(wù)的概率也越大
⑤BestAvaliableRule:過濾掉失效的服務(wù)實例,順便找出并發(fā)最小的服務(wù)實例來使用
⑥ZoneAvoidanceRule:判斷所在的區(qū)域,選擇最近的服務(wù)調(diào)用
⑦NacosRule:按隨機與配置的權(quán)重進行選擇服務(wù)器
3.2修改默認的負載均衡策略--配置類的方式
①賦值一份消費端項目OrderNacos,重命名為OrderRibbon
刪除OrderRibbon中原先的OrderNacos.iml文件
修改OrderRibbon的pom.xml的ArtifactId值
把新添加的OrderRibbon添加到父項目的pom.xml的module中
刷新maven項目
②創(chuàng)建RibbonConfig配置類
使用@Configuration標識是配置類,使用@Bean注入到spring容器中,方法名必須叫iRule,否則無效。
/** * 重寫負載均衡配置類 */ @Configuration public class RibbonConfig { //方法名一定要叫iRule @Bean public IRule iRule(){ return new RandomRule(); } }
****注意此配置類不能放在@SpringBootApplication的注解@CompentScan掃描得到的地方,否則自定義的配置類就會被所有的RibbonClients共享,
springboot啟動類,沒有配置掃描范圍的話,默認掃描到與啟動類OrderApplication同目錄級別的文件,此處為qingyun包下的文件都會被掃描到。
配置的目錄如下:
③在啟動類中使用注解@RibbonClients加入配置的自定義負載均衡器,value里面可以配置多個負載均衡器,是個數(shù)組類型的值;調(diào)用服務(wù)創(chuàng)建的RestTemplate使用@LoadBalanced進行修飾。
④
啟動消費者,兩個不同端口的服務(wù)提供者,通過頁面訪問,查看負載均衡機制由之前默認的改為輪詢的方式
3.3修改默認的負載均衡策略--配置文件的方式
使用配置文件的方式設(shè)定負載均衡方式,具體到某個服務(wù),格式:服務(wù)名.ribbon.NFLoadBalancerRuleClassName=服務(wù)方式
stock-service.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
在nacos管理界面配置服務(wù)器的權(quán)重,權(quán)重越大,被選中的概率越大。
也可以在項目配置文件中設(shè)置
#設(shè)置服務(wù)的權(quán)重 spring.cloud.nacos.discovery.weight=4
3.4自定義負載均衡策略
(1)定義一個類繼承AbstractLoadBalancerRule,重寫choose方法
/** * 自定義負載均衡策略 */ public class CustomRule extends AbstractLoadBalancerRule { @Override public void initWithNiwsConfig(IClientConfig iClientConfig) { } @Override public Server choose(Object o) { ILoadBalancer loadBalancer = this.getLoadBalancer(); //獲取當前請求的實例集合 List<Server> reachableServers = loadBalancer.getReachableServers(); //使用線程安全生成一個隨機數(shù) int i = ThreadLocalRandom.current().nextInt(reachableServers.size()); //獲取服務(wù) Server server = reachableServers.get(i); return server; } }
(2)在application.properties中添加配置信息,指向自定義的配置類
stock-service.ribbon.NFLoadBalancerRuleClassName=com.rule.CustomRule
(3)開啟ribbon饑餓加載
當沒有任何配置的情況下,第一次請求服務(wù)時,才會請求加載對應(yīng)的服務(wù)實例
可以在配置文件application.properties中配置饑餓加載
#開啟ribbon饑餓加載 ribbon.eager-load.enabled=true #饑餓加載是服務(wù),多個使用逗號隔開 ribbon.eager-load.clients=stock-service
啟動項目的時候,加載配置服務(wù)使用的負載均衡策略
4.使用spring cloud loadbalancer替代ribbon
(1)在pom.xml中引入nacos-discovery時,去除ribbon,此時項目依賴的包里面已經(jīng)移除ribbon
(2)pom.xml中添加loadbalancer依賴,前提是項目中已經(jīng)引入了spring cloud依賴(父maven已經(jīng)引入)
<!-- 添加loadbalancer依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
(3)創(chuàng)建RestTemplate時,需要加@LoadBalanced
//程序啟動時創(chuàng)建RestTemplate //使用注解LoadBalanced標識負載均衡,默認輪詢的方式 @Bean @LoadBalanced public RestTemplate restTemplate(RestTemplateBuilder builder){ RestTemplate build = builder.build(); return build; }
(4)application.properties中禁用ribbon
#禁用ribbon spring.cloud.loadbalancer.ribbon.enabled=false
(5)若是想自定義loadbalancer,與自定義ribbon類似的方式,使用@LoadBalancerClients配置到springboot啟動類中
到此這篇關(guān)于Spring cloud alibaba--Ribbon負載均衡的文章就介紹到這了,更多相關(guān)Spring cloud alibaba--Ribbon負載均衡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中@Value讀取properties作為map或list的操作
這篇文章主要介紹了Spring中@Value讀取properties作為map或list的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Spring AOP如何自定義注解實現(xiàn)審計或日志記錄(完整代碼)
這篇文章主要介紹了Spring AOP如何自定義注解實現(xiàn)審計或日志記錄(完整代碼),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12SpringBoot利用注解來實現(xiàn)Redis分布式鎖
有些業(yè)務(wù)請求,屬于耗時操作,需要加鎖,防止后續(xù)的并發(fā)操作,同時對數(shù)據(jù)庫的數(shù)據(jù)進行操作,需要避免對之前的業(yè)務(wù)造成影響。本文將利用注解來實現(xiàn)Redis分布式鎖,需要的可以參考一下2022-09-09- 不喜歡羅里吧嗦,講的很精簡易懂。從基礎(chǔ)開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
Maven將代碼及依賴打成一個Jar包的方式詳解(最新推薦)
這篇文章主要介紹了Maven將代碼及依賴打成一個Jar包的方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼
這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼,需要的朋友可以參考下2017-04-04最新評論