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调用。
网友评论