Ribbon功能测试及源码分析
Ribbon功能测试
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- 使用ribbon
// 生成bean
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
// 注入并使用bean
@GetMapping("testRibbon")
public void testRibbon(String serviceName) {
String result = restTemplate.getForObject("http://" + serviceName + "/hello", String.class);
}
源码分析
- 获取服务组中单个实例
// 测试从多个实例中随机选择实例
@GetMapping("testRibbonRule")
public String getRibbonRule(String serviceName){
return loadBalancerClient.choose(serviceName).toString();
}
- 实例获取算法–轮询
com.netflix.loadbalancer.AbstractServerPredicate#incrementAndGetModulo
nextIndex是一个原子整形来保证的线程安全
负载均很算法
-
RoundRobinRule
轮询算法 -
RandomRule
随机算法 -
权重
按照权重选择,ribbon自已提供的算法并没有该类算法 -
iphash
按照ip区hash选择,ribbon自已提供的算法并没有该类算法 -
AvailabilityFilteringRule
过滤掉以下两类服务节点,即选择可用的节点- 由于连续连接或读失败而处于断路器触发状态
- 活动连接超过限制
-
WeightedResponseRule
根据响应时间计算权重 -
RetryRule
通过重试,获取可用的节点
-
BestAvliableRule
选取调用量最小的服务 -
ZoneAvoilableRule
选取区域亲和性的服务
指定负载均衡策略
- yaml中指定
eureka-client-1: # 服务提供者服务名
ribbon:
NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡策略全限定名称
- 全局策略修改
/**
* 向容器中放入一个rule对象,任何负载均衡都是用的这个算法
*
* @return
*/
@Bean
public IRule ribbonRule() {
return new RandomRule();//这里配置策略,和配置文件对应
}
- 自定义策略
实现IRule接口