springcloud ribbon的 @LoadBalanced注解
本文内容纲要:
在使用springcloudribbon客户端负载均衡的时候,可以给RestTemplatebean加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力:
@Bean
@LoadBalanced
RestTemplaterestTemplate(){
returnnewRestTemplate();
}
是不是很神奇?打开@LoadBalanced的注解源码,并没有什么特殊的东东:
packageorg.springframework.cloud.client.loadbalancer;
importorg.springframework.beans.factory.annotation.Qualifier;
importjava.lang.annotation.Documented;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Inherited;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
/**
*AnnotationtomarkaRestTemplatebeantobeconfiguredtouseaLoadBalancerClient
*@authorSpencerGibb
*/
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public@interfaceLoadBalanced{
}
唯一不同的地方就是多了一个@Qulifier注解.
搜索@LoadBalanced注解的使用地方,发现只有一处使用了,在LoadBalancerAutoConfiguration这个自动装配类中:
@LoadBalanced
@Autowired(required=false)
privateList
@Bean
publicSmartInitializingSingletonloadBalancedRestTemplateInitializer(
finalList
returnnewSmartInitializingSingleton(){
@Override
publicvoidafterSingletonsInstantiated(){
for(RestTemplaterestTemplate:LoadBalancerAutoConfiguration.this.restTemplates){
for(RestTemplateCustomizercustomizer:customizers){
customizer.customize(restTemplate);
}
}
}
};
}
@Autowired(required=false)
privateList
@Bean
@ConditionalOnMissingBean
publicLoadBalancerRequestFactoryloadBalancerRequestFactory(
LoadBalancerClientloadBalancerClient){
returnnewLoadBalancerRequestFactory(loadBalancerClient,transformers);
}
@Configuration
@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
staticclassLoadBalancerInterceptorConfig{
@Bean
publicLoadBalancerInterceptorribbonInterceptor(
LoadBalancerClientloadBalancerClient,
LoadBalancerRequestFactoryrequestFactory){
returnnewLoadBalancerInterceptor(loadBalancerClient,requestFactory);
}
@Bean
@ConditionalOnMissingBean
publicRestTemplateCustomizerrestTemplateCustomizer(
finalLoadBalancerInterceptorloadBalancerInterceptor){
returnnewRestTemplateCustomizer(){
@Override
publicvoidcustomize(RestTemplaterestTemplate){
List
restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list);
}
};
}
}
这段自动装配的代码的含义不难理解,就是利用了RestTempllate的拦截器,使用RestTemplateCustomizer对所有标注了@LoadBalanced的RestTemplateBean添加了一个LoadBalancerInterceptor拦截器,而这个拦截器的作用就是对请求的URI进行转换获取到具体应该请求哪个服务实例ServiceInstance。
---------------------
作者:xiao_jun_0820
来源:CSDN
原文:https://blog.csdn.net/xiao_jun_0820/article/details/78917215
版权声明:本文为博主原创文章,转载请附上博文链接!
本文内容总结:
原文链接:https://www.cnblogs.com/miracle77hp/p/10106616.html