ribbon初始化

本文介绍了如何通过RestTemplate结合LoadBalancerInterceptor和LoadBalancerClient在发送HTTP请求时实现客户端负载均衡。通过创建RestTemplateCustomizer,将拦截器加载到RestTemplate中,并利用SmartInitializingSingleton接口确保所有RestTemplate实例都被增强。
摘要由CSDN通过智能技术生成
  • 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);
				}
			};
		}
	}
}

  1. 生成SmartInitializingSingleton匿名内部类,实现该接口的方法afterSingletonsInstantiated,方法被调用后会把restTemplates遍历后调用RestTemplateCustomizer的customize方法
  2. 生成LoadBalancerInterceptor拦截器,在客户端发送请求时,提供客户端负载均衡的能力
  3. 生成RestTemplateCustomizer接口的匿名类,实现该接口的方法customize,方法作用是给RestTemplate加上LoadBalancerInterceptor拦截器
  4. 当SmartInitializingSingleton.afterSingletonsInstantiated被调用后就会遍历把RestTemplate都加上拦截器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值