ribbon详解

97 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

Ribbon用于解决负载问题,正常的负载分两种方式:

  • 服务端负载:服务列表存储在客户端,好比买票的人心里都知道有几个窗口在卖票,自己选择去哪边排队,Ribbon属于这种
  • 客户端负载:服务列表存储在服务端,好比黄牛票,买票的人不知道几个窗口买票,所以都找黄牛,但是黄牛知道有多少窗口,他自己去排队,Nginx属于这种

添加依赖

如果配合Openfeign使用,会自动引入Ribbon,不用再单独添加依赖,否则需要手动添加:

image.png

这里提示重复,是因为项目中使用了nacos,在nacos/discovery中也引入了ribbon组件。

核心接口介绍

LoadBalancerClient

public interface ServiceInstanceChooser {
	// 根据serviceId和负载策略,在服务列表中选择一个可用的服务实例
	ServiceInstance choose(String serviceId);
}

public interface LoadBalancerClient extends ServiceInstanceChooser {
	// 执行服务调用
	<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
	// 执行服务调用
	<T> T execute(String serviceId, ServiceInstance serviceInstance,
			LoadBalancerRequest<T> request) throws IOException;
	// 根据服务实例解析真实的URI
	URI reconstructURI(ServiceInstance instance, URI original);
}

LoadBalancerAutoConfiguration 自主配置类

自动配置类主要干了这么几件事:

  • 创建一个LoadBalancerAutoConfiguration的bean,用于拦截对外请求,然后执行负载流程
  • 把@LoadBalanced标注的RestTemplate保存到一个列表中
  • 创建一个RestTemplateCustomizer的bean,给上面列表中的RestTemplate添加拦截器LoadBalancerAutoConfiguration

自动配置就是把添加了负载的RestTemplate保存下来,并添加拦截器,每次对外请求(Ribbon是客户端负载组建)都会被拦截器拦截住,施加负载策略,然后再真正执行服务调用。

修改负载策略

因为Ribbon是客户端负载,所以要把策略IRule配置在请求发起端,即客户端

@Configuration
public class ProxyConfig {
    @Bean
    IRule iRule(){
        return  new RandomRule();
    }
}

Ribbon中的7中负载均衡算法:

  • RoundRobinRule:轮询;
  • RandomRule:随机;
  • AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
  • WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule;
  • RetryRule:先按照RoundRobinRule(轮询)策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务;
  • BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
  • ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器,在没有Zone的情况下是类似轮询的算法;

扩展阅读

www.jianshu.com/p/1bd66db5d…