Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
其他使用ribbon的有
- RestTemplate
- Feign
- Zuul
lb规则
上次讲过几种实现lb的几种,使用@LoadBalanced 和LoadBalancerClient 都是基于Ribbon实现的
本文主要围绕ribbon展开讨论
/**
* 使用LoadBalancerClient 通过应用名称获取url 然后用restTemplate访问
* @return
*/
@GetMapping("/lbmsg")
public String lbMsg() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance instance = loadBalancerClient.choose("PRODUCT");
String url = String.format("http://%s:%s", instance.getHost(), instance.getPort(),"/msg");
String result = restTemplate.getForObject(url, String.class);
log.info("response={}", result);
return result;
}
通过源码 可以找到
因为我开了两个server 现在serverlist显示就是2个,这个是ok的
在看下,默认的负责规则是什么,源码中默认的是
private static final IRule DEFAULT_RULE = new RoundRobinRule();
打了断点,看了一下
这里的rule默认是随机的
果然是 RoundRobinRule
日志答应结果也是轮询的.
那么其他规则呢?
lb规则类型
- RoundRobinRule
最基础的轮询算法–默认使用的算法。
- RandomRule
见名知意,随机选取。
- AvailabilityFilteringRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务。然后对剩余的服务列表按照轮询策略进行访问。
- WeightedResponseTimeRule
根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。刚启动时如果统计信息不足,会使用 RoundRobinRule策略。等统计信息足够,会切换到WeightedResponseTimeRule。
- RetryRule
先按照 RoundRobinRule策略获取服务,如果获取服务失败则在指定时间内会进行重试获取可用的服务。
BestAvailableRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选取一个并发量最小的服务。
- ZoneAvoidanceRule
复合判断Server所在区域的性能和Server的可用性来选择服务器。
自定义lb规则
- 配置文件配置
service-provider-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 通过自定义配置也可以
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
// 负载均衡规则,改为随机
return new RandomRule();
}
@RibbonClient(name = "service-provider-user", configuration = RibbonConfiguration.class)
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}