在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力:

@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}

是不是很神奇?打开@LoadBalanced的注解源码,并没有什么特殊的东东:
package org.springframework.cloud.client.loadbalancer;

import org.springframework.beans.factory.annotation.Qualifier;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 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 {
}
唯一不同的地方就是多了一个@Qulifier注解.

搜索@LoadBalanced注解的使用地方,发现只有一处使用了,在LoadBalancerAutoConfiguration这个自动装配类中:

@LoadBalanced
@Autowired(required = false)
private List<RestTemplate> restTemplates = Collections.emptyList();
@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);
}
}
}
};
}

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

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

这段自动装配的代码的含义不难理解,就是利用了RestTempllate的拦截器,使用RestTemplateCustomizer对所有标注了@LoadBalanced的RestTemplate Bean添加了一个LoadBalancerInterceptor拦截器,而这个拦截器的作用就是对请求的URI进行转换获取到具体应该请求哪个服务实例ServiceInstance。
---------------------
作者:xiao_jun_0820
来源:CSDN
原文:https://blog.csdn.net/xiao_jun_0820/article/details/78917215
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. Python学习--Python简介
  2. 爬虫初探(2)之requests
  3. spring+hibernate实体类注解详解(非原创) + cascade属性取值
  4. Oracle参数化查询
  5. [Tools] 使用work2013发布博客
  6. echart.js的使用与API
  7. 学习jsp(2)
  8. 百度地图Api之自定义标注:(获得标注的经纬度和中心经纬度即缩放度)
  9. 初学Android 一 基本开发环境
  10. unity 嵌入 百度分享 与 游戏内购物 iap
  11. UIImage与UIColor互转
  12. 如何给 UILable 添加横线
  13. Practical Node.js (2018版) 13章, Node HTTP/2 Servers
  14. logstash数据处理示例
  15. css学习_文本有关的样式属性、sublime快捷生成标签
  16. python第三方库scrapy框架的安装
  17. BZOJ 1024 [SCOI2009]生日快乐 (搜索)
  18. html (第四本书第五章参考)
  19. Open Flash Chart 之线图
  20. array_unshift() 函数用于向数组插入新元素。新数组的值将被插入到数组的开头。

热门文章

  1. vue环境配置脚手架搭建,生命周期,钩子
  2. Python3-socket模块-低级网络接口
  3. MongoDB快速入门教程 (2)
  4. 利用oracle数据库闪回功能将oracle数据库按时间点恢复
  5. gitlab、github账户密码修改后,记得修改本地账户的git凭据
  6. Linux 文件类型 ,文件权限
  7. CentOS/RHEL 6.4/5.9 安装 Adobe Flash Player 11.2
  8. 解决wpf项目中无法添加OpenFileDialog 实例的问题
  9. Python18行代码做出来这样有点浪漫,又有点极客的“内涵”图
  10. 由VIP漂移引发的算法异常问题调查和解决