ribbon 源码分析
一、两个注解
RibbonClients 、 RibbonClients 注解上面都导入了 这个类 @Import(RibbonClientConfigurationRegistrar.class)
RibbonClientConfigurationRegistrar 这个类 实现了 ImportBeanDefinitionRegistrar 接口。
注册成 RibbonClientSpecification 这个类的bean,供后面使用。
二、 在 netflix-ribbon 包下的 spring.factories 的 EnableAutoConfiguration 自动加载这个类 RibbonAutoConfiguration
这个类是 @AutoConfigureBefore({LoadBalancerAutoConfiguration.class 这个类是在 LoadBalancerAutoConfiguration 类之前加载的
RibbonAutoConfiguration 这个类有个属性
private List<RibbonClientSpecification> configurations = new ArrayList<>();就是步骤一来的。
生成 几个重要的bean
1、SpringClientFactory 这个bean 供 LoadBalancerAutoConfiguration 这个类使用
@Bean public SpringClientFactory springClientFactory() { SpringClientFactory factory = new SpringClientFactory(); factory.setConfigurations(this.configurations); return factory; }
2、
public LoadBalancerClient loadBalancerClient()
{ return new RibbonLoadBalancerClient(springClientFactory()); }
三、 也是通过八爪鱼 加载这个类 LoadBalancerAutoConfiguration
@Bean
public LoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient,
LoadBalancerRequestFactory requestFactory) {
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
}
生产个重要的bean LoadBalancerInterceptor 构造函数里的 loadBalancerClient 就是上面第二步生成的RibbonLoadBalancerClient类
@Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(
final LoadBalancerInterceptor loadBalancerInterceptor) {
return restTemplate -> {
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list);
};
}
@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);
}
}
});
}
而 RestTemplate extends InterceptingHttpAccessor 实现了这个类 ,InterceptingHttpAccessor 里面有个属性
private final List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
而 LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 这个接口。
总结 LoadBalancerAutoConfiguration 这个类的作用就是把标有 LoadBalanced 注解的 RestTemplate 类 放入到 拦截器里去。
四、LoadBalancerInterceptor 这个类的 intercept 方法
return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));
就是执行 RibbonLoadBalanceClient 的 execute方法
ILoadBalancer有很多实现,那具体是用的哪个类呢,可以通过RibbonClientConfiguration 也查看