- 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;
}
}