0
点赞
收藏
分享

微信扫一扫

Ribbon源码分析LoadBalancerClient

Ribbon源码分析LoadBalancerClient

LoadBalancerAutoConfiguration实现客户端负载均衡器的自动化配置类。

LoadBalancerAutoConfiguration:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;

/**
 * Auto configuration for Ribbon (client side load balancing).
 *
 * @author Spencer Gibb
 * @author Dave Syer
 */
@Configuration
@ConditionalOnClass(RestTemplate.class)
@ConditionalOnBean(LoadBalancerClient.class)
public class LoadBalancerAutoConfiguration {

    @LoadBalanced
    @Autowired(required = false)
    private List<RestTemplate> restTemplates = Collections.emptyList();

    @Bean
    public SmartInitializingSingleton loadBalancedRestTemplateInitializer(
            final List<RestTemplateCustomizer> customizers) {
        return new SmartInitializingSingleton() {
            @Override
            public void afterSingletonsInstantiated() {
                for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
                    for (RestTemplateCustomizer customizer : customizers) {
                        customizer.customize(restTemplate);
                    }
                }
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean
    public RestTemplateCustomizer restTemplateCustomizer(
            final LoadBalancerInterceptor loadBalancerInterceptor) {
        return new RestTemplateCustomizer() {
            @Override
            public void customize(RestTemplate restTemplate) {
                List<ClientHttpRequestInterceptor> list = new ArrayList<>(
                        restTemplate.getInterceptors());
                list.add(loadBalancerInterceptor);
                restTemplate.setInterceptors(list);
            }
        };
    }

    @Bean
    public LoadBalancerInterceptor ribbonInterceptor(
            LoadBalancerClient loadBalancerClient) {
        return new LoadBalancerInterceptor(loadBalancerClient);
    }

}

LoadBalancerAutoConfiguration类头的注解表示Ribbon实现的负载均衡自动化配置需要满足两个条件

  • @ConditionalOnClass(RestTemplate.class):RestTemplate必须在当前工程的环境中
  • @ConditionalOnBean(LoadBalancerClient.class):在Spring的Bean工厂中必须有LoadBalancerClient的实现Bean

自动化配置类中主要做三件事:

  • 创建一个LoadBalancerInterceptor的Bean,用于实现对客户端发起请求时进行拦截,实现客户端负载均衡
  • 创建RestTemplateCustomizer的Bean,用于RestTemplate增加LoadBalancerInterceptor拦截器
  • 维护被LoadBalanced注解修饰的RestTemplate对象列表,并在这里进行初始化,通过RestTemplateCustomizer的实例给客户端负载均衡的RestTemplate增加LoadBalancerInterceptor拦截器

这就是LoadBalancerAutoConfiguration的源码分析,它可以实现客户端负载均衡器的自动化配置类。这下一篇文章中我们要分析拦截器LoadBalancerInterceptor做了什么功能,我们下一篇文章不见不散咯。让我们一起深入Ribbon源码,共同学习

举报

相关推荐

0 条评论