spring cloud @LoadBalanced

  • RestTemplate指定了@LoadBalanced注解,表示开启了robbin的负载均衡功能。
  • 在LoadBalancerAutoConfiguration中有自动注入list的属性
    @LoadBalanced
    @Autowired(required = false)
    private List<RestTemplate> restTemplates = Collections.emptyList();

这里是所有指定了@LoadBalanced注解的RestTemplate bean都会自动注入到restTemplates中。

  • 为什么RestTemplate bean和restTemplates都必须指定@LoadBalanced?这是因为@LoadBalanced继承了@Qualifier。所以restTemplates只会注入指定了@LoadBalanced注解的RestTemplate bean。
/**
 * Annotation to mark a RestTemplate bean to be configured to use a LoadBalancerClient
 * @author Spencer Gibb
 */
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
  • 验证。
@Test
    public void multipleRestTemplates() {
        ConfigurableApplicationContext context = init(TwoRestTemplates.class);
        final Map<String, RestTemplate> restTemplates = context
                .getBeansOfType(RestTemplate.class);

        assertThat(restTemplates, is(notNullValue()));
        Collection<RestTemplate> templates = restTemplates.values();
        assertThat(templates, hasSize(3));
        TwoRestTemplates.Two two = context.getBean(TwoRestTemplates.Two.class);

        TwoRestTemplates twoRestTemplates = context.getBean(TwoRestTemplates.class);
        //只注入了绑定了@LoadBalanced的RestTemplate
        Map<String,RestTemplate> restTemplateList = twoRestTemplates.getRestTemplates();

        assertThat(two.loadBalanced, is(notNullValue()));
        assertLoadBalanced(two.loadBalanced);

        assertThat(two.nonLoadBalanced, is(notNullValue()));
        assertThat(two.nonLoadBalanced.getInterceptors(), is(empty()));
    }

    protected ConfigurableApplicationContext init(Class<?> config) {
        return new SpringApplicationBuilder().web(false)
                .properties("spring.aop.proxyTargetClass=true")
                .sources(config, LoadBalancerAutoConfiguration.class).run();
    }
@Configuration
    protected static class TwoRestTemplates {

        @Primary //当有多个RestTemplatebean时,Autowired会指定@Primary修饰的bean
        @Bean
        RestTemplate restTemplate() {
            return new RestTemplate();
        }

        @Bean
        RestTemplate restTemplate2() {
            return new RestTemplate();
        }

        @LoadBalanced
        @Bean
        RestTemplate loadBalancedRestTemplate() {
            return new RestTemplate();
        }

        @Bean
        LoadBalancerClient loadBalancerClient() {
            return new NoopLoadBalancerClient();
        }

        @Bean
        LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory() { return new LoadBalancedRetryPolicyFactory.NeverRetryFactory();}

        @LoadBalanced
        @Autowired(required = false)
        public Map<String,RestTemplate> restTemplates = new HashMap<>();

        public Map<String,RestTemplate> getRestTemplates() {
            return restTemplates;
        }

        @Configuration
        protected static class Two {
            @Autowired
            RestTemplate nonLoadBalanced;

            @Autowired
            @LoadBalanced
            RestTemplate loadBalanced;

            @Autowired
            @LoadBalanced
            RestTemplate loadBalanced2;
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值