- RestTemplate 发送http请求。
- LoadBalancerInterceptor 拦截器 。
- LoadBalancerClient 负载均衡类。
- RestTemplateCustomizer 把interceptor加载到RestTemplate使得在发送http请求的时候增加客户端负载均衡的能力。
@Configuration
@ConditionalOnClass(RestTemplate.class)
@ConditionalOnBean(LoadBalancerClient.class)
@EnableConfigurationProperties(LoadBalancerRetryProperties.class)
public class LoadBalancerAutoConfiguration {
@LoadBalanced
@Autowired(required = false)
private List<RestTemplate> restTemplates = Collections.emptyList();
//创建SmartInitializingSingleton接口的匿名内部类
@Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializer(
final List<RestTemplateCustomizer> customizers) {
return new SmartInitializingSingleton() {
//此方法被调用后会把restTemplates遍历后调用RestTemplateCustomizer的customize方法(此方法是把restTemplate加上拦截器)
@Override
public void afterSingletonsInstantiated() {
for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
for (RestTemplateCustomizer customizer : customizers) {
customizer.customize(restTemplate);
}
}
}
};
}
@Autowired(required = false)
private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList();
@Bean
@ConditionalOnMissingBean
public LoadBalancerRequestFactory loadBalancerRequestFactory(
LoadBalancerClient loadBalancerClient) {
return new LoadBalancerRequestFactory(loadBalancerClient, transformers);
}
@Configuration
@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
static class LoadBalancerInterceptorConfig {
@Bean
public LoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient,
LoadBalancerRequestFactory requestFactory) {
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
}
//把拦截器加载到restTemplatess中
@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);
}
};
}
}
}
- 生成SmartInitializingSingleton匿名内部类,实现该接口的方法afterSingletonsInstantiated,方法被调用后会把restTemplates遍历后调用RestTemplateCustomizer的customize方法
- 生成LoadBalancerInterceptor拦截器,在客户端发送请求时,提供客户端负载均衡的能力
- 生成RestTemplateCustomizer接口的匿名类,实现该接口的方法customize,方法作用是给RestTemplate加上LoadBalancerInterceptor拦截器
- 当SmartInitializingSingleton.afterSingletonsInstantiated被调用后就会遍历把RestTemplate都加上拦截器。