ribbon源码分析

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 也查看 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值