首页 > 编程语言 > 详细

Spring Cloud Ribbon的原理

时间:2021-01-13 21:12:42      阅读:48      评论:0      收藏:0      [点我收藏+]

直接开撸代码,通过代码来看Ribbon是如何实现的。

技术分享图片

1:RibbonAutoConfiguration配置生成RibbonLoadBalancerClient实例。

代码位置:org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration

 1 @Configuration
 2 @Conditional({RibbonAutoConfiguration.RibbonClassesConditions.class})
 3 @RibbonClients
 4 @AutoConfigureAfter(
 5     name = {"org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration"}
 6 )
 7 @AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class})
 8 @EnableConfigurationProperties({RibbonEagerLoadProperties.class, ServerIntrospectorProperties.class})
 9 public class RibbonAutoConfiguration {
10     @Autowired(
11         required = false
12     )
13     private List<RibbonClientSpecification> configurations = new ArrayList();
14     @Autowired
15     private RibbonEagerLoadProperties ribbonEagerLoadProperties;
16 
17     //...略
18 
19     @Bean
20     @ConditionalOnMissingBean({LoadBalancerClient.class})
21     public LoadBalancerClient loadBalancerClient() {
22         return new RibbonLoadBalancerClient(this.springClientFactory());
23     }
24 
25     // ....略
26 
27 }    

先看配置条件项,RibbonAutoConfiguration配置必须在LoadBalancerAutoConfiguration配置前执行,因为在LoadBalancerAutoConfiguration配置中会使用RibbonLoadBalancerClient实例。
RibbonLoadBalancerClient继承自LoadBalancerClient接口,是负载均衡客户端,也是负载均衡策略的调用方。

2.LoadBalancerInterceptorConfig配置生成:
1).负载均衡拦截器LoadBalancerInterceptor实例
包含:
  LoadBalancerClient实现类的RibbonLoadBalancerClient实例
  负载均衡的请求创建工厂LoadBalancerRequestFactory:实例
2).RestTemplate自定义的RestTemplateCustomizer实例

代码位置:org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration

 1 @Configuration(proxyBeanMethods = false)
 2 @ConditionalOnClass(RestTemplate.class)
 3 @ConditionalOnBean(LoadBalancerClient.class)
 4 @EnableConfigurationProperties(LoadBalancerRetryProperties.class)
 5 public class LoadBalancerAutoConfiguration {
 6 
 7     @LoadBalanced
 8     @Autowired(required = false)
 9     private List<RestTemplate> restTemplates = Collections.emptyList();
10 
11     @Autowired(required = false)
12     private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList();
13 
14     @Bean
15     public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
16             final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {
17         return () -> restTemplateCustomizers.ifAvailable(customizers -> {
18             for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
19                 for (RestTemplateCustomizer customizer : customizers) {
20                     customizer.customize(restTemplate);
21                 }
22             }
23         });
24     }
25 
26     @Bean
27     @ConditionalOnMissingBean
28     public LoadBalancerRequestFactory loadBalancerRequestFactory(
29             LoadBalancerClient loadBalancerClient) {
30         return new LoadBalancerRequestFactory(loadBalancerClient, this.transformers);
31     }
32 
33     @Configuration(proxyBeanMethods = false)
34     @ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
35     static class LoadBalancerInterceptorConfig {
36 
37         @Bean
38         public LoadBalancerInterceptor ribbonInterceptor(
39                 LoadBalancerClient loadBalancerClient,
40                 LoadBalancerRequestFactory requestFactory) {
41             return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
42         }
43 
44         @Bean
45         @ConditionalOnMissingBean
46         public RestTemplateCustomizer restTemplateCustomizer(
47                 final LoadBalancerInterceptor loadBalancerInterceptor) {
48             return restTemplate -> {
49                 List<ClientHttpRequestInterceptor> list = new ArrayList<>(
50                         restTemplate.getInterceptors());
51                 list.add(loadBalancerInterceptor);
52                 restTemplate.setInterceptors(list);
53             };
54         }
55 
56     }
57 
58         // .....略    
59 }
60 
61     

先看配置条件项:
要求在项目环境中必须要有RestTemplate类。
要求必须要有LoadBalancerClient接口的实现类的实例,也就是上一步生成的RibbonLoadBalancerClient。

 

Spring Cloud Ribbon的原理

原文:https://www.cnblogs.com/jelly12345/p/14273558.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!