ribbon初始化

springcloud 专栏收录该内容
3 篇文章 0 订阅
  • 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都加上拦截器。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值