Spring Cloud+Ribbon自定义负载均衡
上篇文章讲了如何在SpringCloud中接入Ribbon通道
,但是应用的负载均衡策略是默认的轮询策略,如果我们要应用其他测试该如何操作呢?
编码方式实现应用Ribbon提供的规则
先上项目文件组织:![](https://img.haomeiwen.com/i3983407/90f907bd4fde523d.png)
1、 编写规则配置类CustomRibbonConfigration
@Configuration
public class CustomRibbonConfigration {
/**
* 自定义Ribbon规则
* @return
*/
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
该类中只是创建了一个IRule的实现类的对象Bean,本例中使用RandomRule来定义随机的规则,默认的是轮询规则,可用的规则实现类有:
- com.netflix.loadbalancer.RoundRobinRule:轮询规则
- com.netflix.loadbalancer.AvailabilityFilteringRule:根据服务是否死掉或者服务处于高并发来分配权重
- com.netflix.loadbalancer.WeightedResponseTimeRule:根据响应时间分配权重
- com.netflix.loadbalancer.RandomRule:随机规则
- com.netflix.loadbalancer.ReryRule:重试(先按照轮询规则获取服务,如果获取服务失败则在指定时间内进行重试)
- com.netflix.loadbalancer.ZoneAvoidanceRule:默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器
-
com.netflix.loadbalancer.BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
2、 创建Ribbon应用配置类UseCustomRibbonWithProvider
@Configuration
@RibbonClient(name = "${provider.user.appId}",configuration = CustomRibbonConfigration.class)
public class UseCustomRibbonWithProvider {
}
其中 provider.user.appId指定了服务端应用id,configuration指定了我们定义的应用规则配置类。
注意
这里需要说明的是,定义的配置类路径,从文件组织路径可以看出CustomRibbonConfigration和UseCustomRibbonWithProvider并没有放在同一个包下,而且CustomRibbonConfigration单独定义在一个包里,为了避免消费者使用的所有的服务提供者都应用类此负载均衡规则,也可自定义一个注解,然后在Application中使用 ComponentScan指定排除的注解类,具体可见传送门
配置文件方式指定规则
- 先上配置:
# 使用配置文件方式指定ribbon规则,目前尚未找到通过编码方式直接配置Ribbon
microservice-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
格式:<clientName>.ribbon.<item>
其中item有:
NFLoadBalancerClassName:应配置ILoadBalancer
NFLoadBalancerRuleClassName:应配置IRule
NFLoadBalancerPingClassName:应配置IPing
NIWSServerListClassName:应配置ServerList
NIWSServerListFilterClassName:应配置ServerListFilter
clientName表示提供服务的服务id
最后
如果想实现自定一的负载均衡算法,可以实现IRule或者继承 AbstractLoadBalancerRule实现其中的chose方法