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包,看看配置类是哪个
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 拦截器
拦截器:
拦截器中主要是为了执行 loadBalancer.execute 方法,现在我们重点来看看这个excute方法:
其中
ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);
这个就是负载均衡器(负载均衡算法)
负载均衡器 BaseLoadBalancer
现在我们来看看基础的负载均衡器BaseLoadBalancer的构造函数
我们可以看到,在里面有一个
this.rule = DEFAULT_RULE;
其中DEFAULT_RULE
private static final IRule DEFAULT_RULE = new RoundRobinRule();
这个就是我们默认的负载均衡算法(轮询算法)
还有很多负载均衡算法,有兴趣的话也可以到这些类里面读读源码