美文网首页
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