LoadBalancerClient
接口 同包有个叫LoadBalancerAutoConfiguration
,看名字就是负载均衡自动化配置的
@Configuration
//必须有RestTemplate类
@ConditionalOnClass(RestTemplate.class)
//必须有LoadBalancerClient的实现bean(`RibbonLoadBalancerClient` )
@ConditionalOnBean(LoadBalancerClient.class)
public class LoadBalancerAutoConfiguration {
//所有被@LoadBalanced注解的restTemplate
@LoadBalanced
@Autowired(required = false)
private List<RestTemplate> restTemplates = Collections.emptyList();
//对上面 所有restTemplate对象列表初始化, 包括都用下面的Customizer来定制
@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);
}
}
}
};
}
//创建一个 用于改造RestTemplate 的bean
// 用于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());
//新加一个负载均衡的拦截器LoadBalancerInterceptor 就是下面这个
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list);
}
};
}
//创建一个拦截器bean 用于对发起请求的拦截
//这个就是负载均衡 拦截器!!!
@Bean
public LoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient) {
//LoadBalancerClient唯一的实现类就是`RibbonLoadBalancerClient` 之前看的
return new LoadBalancerInterceptor(loadBalancerClient);
}
}
看来 LoadBalancerAutoConfiguration
,负载均衡自动化配置 就是把@LoadBalanced注解的restTemplate 都加上一个负载均衡拦截器LoadBalancerInterceptor,传入LoadBalancerInterceptor的是LoadBalancerClient 唯一的实现类RibbonLoadBalancerClient