直接开撸代码,通过代码来看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。
原文:https://www.cnblogs.com/jelly12345/p/14273558.html