Ribbon的负载均衡算法
提供的负载均衡算法
Ribbon中有七种负载均衡算法可供选择
RoundRobinRule,轮询
RandomRule,随机
AvailabilityFilteringRule,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务(可以通过niws.loadbalancer.<clientName>.connectionFailureCountThreshold来配置连接失败的次数),还有并发的连接数量超过阈值的服务(可以通过<clientName>.ribbon.ActiveConnectionsLimit来配置最高并发数),然后对剩余的服务列表按照轮询策略进行访问
WeightedResponseTimeRule,根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule
RetryRule,先按照轮询策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务
BestAvailableRule,会先过滤掉由于多次访问故障而处于跳闸状态的服务,然后选择一个并发量最小的进行访问
ZoneAvoidanceRule,复合判断server所在区域的性能和server的可用性选择
选择负载均衡算法
1 2 3 4 5
| @Bean public IRule myRule(){ return new RandomRule(); }
|
自定义负载均衡算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
public class MyRule extends AbstractLoadBalancerRule { Random rand;
public MyRule() { rand = new Random(); }
public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } Server server = null;
while (server == null) { if (Thread.interrupted()) { return null; } List<Server> upList = lb.getReachableServers(); List<Server> allList = lb.getAllServers();
int serverCount = allList.size(); if (serverCount == 0) {
return null; } int index = rand.nextInt(serverCount); server = upList.get(index);
if (server == null) {
Thread.yield(); continue; }
if (server.isAlive()) { return (server); }
server = null; Thread.yield(); }
return server;
}
@Override public Server choose(Object key) { return choose(getLoadBalancer(), key); }
@Override public void initWithNiwsConfig(IClientConfig clientConfig) {
} }
|
配置该bean
1 2 3 4 5 6 7 8
| @Configuration public class MyRuleConfig {
@Bean public IRule myRule(){ return new MyRule(); } }
|
使用@RibbonClient来使用自定义的负载均衡类,但是这个自定义的负载均衡类不可以在@ComponentScan所能扫描的包下,否则这个自定义的负载均衡算法就会被所有的Ribbon客户端所共享,无法达到对于某个微服务定制的效果了,该bean在使用的时候才会进行实例化
1 2 3 4 5 6 7 8 9
| @SpringBootApplication @EnableEurekaClient
@RibbonClient(name = "micro-service-dept-provider",configuration = MyRule.class) public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class,args); } }
|
除了使用注解,还可以使用配置文件来配置服务使用的ribbon负载均衡算法
1 2 3
| micro-service-dept-provider: ribbon: NFLoadBalancerRuleClassName: com.zhanghe.ribbon.rule.MyRule
|
配置格式为<clientName>.ribbon
- NFLoadBalancerClassName 配置ILoadBalancer的实现类
- NFLoadBalancerRuleClassName 配置IRule的实现类
- NFLoadBalancerPingClassName 配置IPing的实现类
- NIWSServerListClassName 配置ServerList的实现类
- NIWSServerListFilterClassName 配置ServerListFilter的实现类