美文网首页
SpringCloud之@LoadBalanced

SpringCloud之@LoadBalanced

作者: 一笑生花青春还她 | 来源:发表于2022-05-25 19:44 被阅读0次

SpringCloud是构建在Spring规则之上的代表作。阅读起来很复杂,其中的@LoadBalanced注解堪称神奇,能够让RestTemplate实现解析vip的效果,那么到底是怎么实现的呢?

乍看@LoadBalanced会让人感觉奇怪,众所周知,注解本身是没有任何作用的,可以理解是一种标记,具体的功能由对注解处理代码实现。从这一点看,LoadBalanced根本没有任何处理类,但是功能确实实现了。

其实玄机出现在@LoadBalanced的元注解@Qualifier.

一,Qualifier的作用。

@Qualifier一般的使用场景是根据名称注入,但是实际上他有个用的不太多的场景,当它注解了一个自定义的注解,那么可以理解为是注入时要进行注解匹配。

直接写一个例子,如下:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

@Qualifier

public @interface Anno {

}

@Bean

public Abc abc1() {

return new Abc1();

}

@Bean

@Anno

public Abc abc2() {

return new Abc2();

}

@Bean

@Anno

public Abc abc3() {

return new Abc3();

}

下面的代码进行注入:

@Autowired

@Anno

List<Abc> abcList;

这里发现,abcList上有一个@Anno,最终注入的是Abc2和Abc3的实例。

实际上,Spring内部确实也是进行的类型判断,代码在org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver中,org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver#checkQualifier方法,

二,如何实现的load balance.

了解了@LoadBalanced的实质,现在我们可以来探究下整个实现过程,在org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration这个类中,配置了

也就是,所有加了@LoadBalanced注解的RestTemplate,会被注入到这个地方,在这个地方,实质上是进行了RestTemplate的自定义配置。

主要是新增了org.springframework.http.client.ClientHttpRequestInterceptor的实现类:org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor,

也就是,你请求的http://test-service/aa/bb中的主机信息test-service将会被获取,并且请求将委派给LoadBalancerClient调用。

相关文章

网友评论

      本文标题:SpringCloud之@LoadBalanced

      本文链接:https://www.haomeiwen.com/subject/vqavrktx.html