欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ribbon源码分析

程序员文章站 2022-06-22 16:17:18
...

ribbon怎么使用

首先来看看ribbon在springcloud项目中是怎么使用的

@Bean
@LoadBalanced
 public RestTemplate restTemplate(){
     return new RestTemplate();
 }

然后直接用restTemplate对象就可以了,是不是有点太简单了,感叹一下,封装得也太好了。现在我们来看看是怎么实现这个功能的。

ribbon原理

找到ribbon配置类

在Eureka的源码分析的时候,讲过springboot的自动装载,在ribbon里面也是使用了这个原理。

  • 我们先找到ribbon的依赖jar包,看看配置类是哪个
    ribbon源码分析

LoadBalancerAutoConfiguration

这里我们很容易就能找到,我们来看看配置文件是怎么写的
来挑重点看,在RibbonAutoConfiguration的注解中有一个注解:

@AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class})

我们要重点关注的是LoadBalancerAutoConfiguration这个类,在这个类中,我们来看看这个方法:

@Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
    return (restTemplate) -> {
        List<ClientHttpRequestInterceptor> list = new ArrayList(restTemplate.getInterceptors());
        list.add(loadBalancerInterceptor);
        restTemplate.setInterceptors(list);
    };
}

这段代码的意思就是:

  • 首先在restTemplate中拿到它的拦截器列表
  • 往这个列表中添加一个ribbon定义的拦截器
    很明显,这个拦截器就是起到处理ribbon功能的作用

LoadBalancerInterceptor 拦截器

拦截器:
ribbon源码分析
拦截器中主要是为了执行 loadBalancer.execute 方法,现在我们重点来看看这个excute方法:
ribbon源码分析
其中

ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);

这个就是负载均衡器(负载均衡算法)

负载均衡器 BaseLoadBalancer

现在我们来看看基础的负载均衡器BaseLoadBalancer的构造函数
ribbon源码分析
我们可以看到,在里面有一个

this.rule = DEFAULT_RULE;

其中DEFAULT_RULE

private static final IRule DEFAULT_RULE = new RoundRobinRule();

这个就是我们默认的负载均衡算法(轮询算法)
还有很多负载均衡算法,有兴趣的话也可以到这些类里面读读源码