首页 文章资讯内容详情

springcloud ribbon的 @LoadBalanced注解

2026-06-01 4 花语

本文内容纲要:

在使用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)

privateListrestTemplates=Collections.emptyList();

@Bean

publicSmartInitializingSingletonloadBalancedRestTemplateInitializer(

finalListcustomizers){

returnnewSmartInitializingSingleton(){

@Override

publicvoidafterSingletonsInstantiated(){

for(RestTemplaterestTemplate:LoadBalancerAutoConfiguration.this.restTemplates){

for(RestTemplateCustomizercustomizer:customizers){

customizer.customize(restTemplate);

}

}

}

};

}

@Autowired(required=false)

privateListtransformers=Collections.emptyList();

@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){

Listlist=newArrayList<>(

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