1. 使用ribbon需要使用@LoadBalanced注解标记RestTemplate,在LoadBalanced接口所在jar包的META-INFO/spring.factories文件,这个文件里面会引入使用的类,会在项目启动时添加到spring容器里
2. 原理实现:
a. 首先我们看引入的类LoadBalancerAutoConfiguration,这个里面会自动装配标注了@LoadBalanced的RestTemplate到一个集合中
a. 首先配置类RibbonAutoConfiguration里面会生成RibbonLoadBalancerClient实例,RibbonLoadBalancerClient继承自LoadBalancerClient接口,是负载均衡客户端,也是负载均衡策略的调用方
@Bean
@ConditionalOnMissingBean(LoadBalancerClient.class)
public LoadBalancerClient loadBalancerClient() {
return new RibbonLoadBalancerClient(springClientFactory());
}
b. 配置类LoadBalancerAutoConfiguration会使用a配置中的RibbonLoadBalancerClient实例,这里面配置了LoadBalancerInterceptorConfig这个拦截器,这个拦截器里面会创建RestTemplateCustomizer实例。然后会将RestTemplateCustomizer也就是将负载均衡器设置给RestTemplate实例,也就是RestTemplate通过注入的拦截器来构建相应请求实现负载均衡
@Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {
return () -> restTemplateCustomizers.ifAvailable(customizers -> {
for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
for (RestTemplateCustomizer customizer : customizers) {
customizer.customize(restTemplate);
}
}
});
}
c. 配置类RibbonClientConfiguration配置生成ZoneAwareLoadBalancer实例,ZoneAwareLoadBalancer继承自ILoadBalancer接口,该接口有一个chooseServer方法。ZoneAwareLoadBalancer类就是默认的负载均衡类,通过对chooseServer的实现选取某个服务实例
d. RestTemplate类里面会执行doExecute
参考博客:
1. https://blog.csdn.net/qq_26323323/article/details/81327669