每天學點SpringCloud(三):自定義Eureka集群負載均衡策略


 

相信看了 每天學點SpringCloud(一):簡單服務提供者消費者調用每天學點SpringCloud(二):服務注冊與發現Eureka這兩篇的同學都了解到了我的套路,沒錯,本篇博客同樣是為了解決上篇的問題的。

 

上篇我們使用Eureka默認的負載均衡解決了消費方調用服務方硬編碼的問題,不過呢,因為是使用的默認負載均衡的策略,所以這次我們就搞一搞事情,來自定義一下它的策略。

 

搞這個策略呢有兩種實現方式

 

通過代碼自定義

通過代碼的方式自定義負責均衡策略時需要注意的是,注意避免SpringBoot的包掃描,因為自定義的規則必須在Eureka的規則實例化以后再實例化才會生效,那么這樣就有兩種方式,

第一種

1.在CloudDemoConsumerApplication類上級新建包config,然后新建LoanBalanced類。使用此類注冊一個IRule以達到替換Eureka的目的

package cn.org.config;

import com.netflix.loadbalancer.*;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class LoadBalanced { @Bean public IRule ribbonRule() { return new RoundRobinRule(); //輪訓 // return new WeightedResponseTimeRule(); //加權權重 //return new RetryRule(); //帶有重試機制的輪訓 //return new RandomRule(); //隨機 //return new TestRule(); //自定義規則 } } 

2.注意包名,CloudDemoConsumerApplication的包名是cn.org.zhixiang。

3.想使用哪種負載均衡策略就new哪一種就ok

4.TestRule為自定義的規則:

package cn.org.config.domain;

import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; import java.util.List; public class TestRule implements IRule { private ILoadBalancer loadBalancer; @Override public Server choose(Object o) { List<Server> servers= loadBalancer.getAllServers(); return servers.get(0); } @Override public void setLoadBalancer(ILoadBalancer iLoadBalancer) { this.loadBalancer=iLoadBalancer; } @Override public ILoadBalancer getLoadBalancer() { return this.loadBalancer; } } 

如果有自定義的需求的話可以參照這個寫法,我這只是測試使用,取的服務列表的第一個。

5.在CloudDemoConsumerApplication類上添加注解@RibbonClient(name = "provider-demo", configuration = cn.org.config.LoadBalanced

.class),指定provider-demo服務使用的是LoadBalanced類提供的規則

 

第二種:

依舊把LoadBalanced放到cn.org.zhixiang包下,不過呢通過自定義注解來解決包掃描的問題

1.自定義一個注解

public @interface ExcludeFromComponentScan { } 

2.類使用剛才自定義的注解標示

@Configuration
@ExcludeFromComponentScan
public class AvoidLoanbalanced {   @Bean   public IRule ribbonRule() {     return new RoundRobinRule();        //輪訓     // return new WeightedResponseTimeRule();  //加權權重     //return new RetryRule();          //帶有重試機制的輪訓     //return new RandomRule();          //隨機     //return new TestRule();           //自定義規則   } } 

3.Application中指定包掃描忽略使用上方注解的類,然后注冊規則

@RibbonClient(name = "provider-demo", configuration = AvoidLoanbalanced.class) @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) }) 

注意:上方兩種方式使用一種就夠了。

 

使用配置文件自定義

#為服務Id名稱為provider-demo的項目配置負載均衡規則為com.netflix.loadbalancer.WeightedResponseTimeRule provider-demo: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule 

 

當然,自定義負載均衡策略只需要選擇代碼或配置文件自定義其中的一種就可以了。畢竟美酒雖好,可不要貪杯哦。

 

GitHub:https://github.com/shiyujun/spring-cloud-demo

 

如果對您有所幫助,請記得幫忙點一個star哦

 

 

 

 

 

本文出自https://zhixiang.org.cn/#/blog/read/9f8bd71e-2482-4014-8566-630aaa75f339,轉載請保留。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM