相信看了 每天學點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,轉載請保留。