源码探索之@LoadBalanced注解工作原理

@LoadBalanced所在依赖包

测试项目所用包spring-cloud-commons:

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_java

@LoadBalanced源码

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {

}

@LoadBalanced的使用

在使用微服务框架时,通过ribbon实现多服务之间的负载均衡,需要对RestTemplatebean对象加上@LoadBalanced注解即可,如下:

@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

@LoadBalanced注解加上后有了什么变化?

查找该注解的使用类,可以看到有2个

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_负载均衡_02

1.AsyncLoadBalancerAutoConfiguration类

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_spring boot_03

2.LoadBalancerAutoConfiguration类

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_负载均衡_04

可以看到,这2个负载均衡自动配置类有个明显的注解差别,配置类2的注解中多了一个@ConditionalOnClass(RestTemplate.class),该注解的意思是:当项目中有RestTemplate.class类时,该配置类才会生效!

3.关注LoadBalancerAutoConfiguration类

3.1代码

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_java_05

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_拦截器_06

标记1处,注入有@LoadBalanced注解的RestTemplatebean对象;

标记2处,给RestTemplate注入拦截器loadBalancerInterceptor

标记4处,注入负载均衡实例。

3.2拦截器loadBalancerInterceptor

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_拦截器_07

标记3处,执行负载均衡对象请求服务实例的动作。

Debug模式看看上述标记4处该负载均衡对象是哪个实例,如下:

LoadBalanced 这个注解一头挂在RestTemplate上 loadbalanced注解原理_负载均衡_08

可以看的是由Ribbon实现的负载均衡。

总结

  1. 使用Ribbon做负载均衡,代码配置RestTemplate,并加上@LoadBalanced注解
  2. @LoadBalanced注解的RestTemplatebean对象被注入到LoadBalancerAutoConfiguration类管理
  3. LoadBalancerAutoConfiguration类给RestTemplate对象添加默认拦截器loadBalancerInterceptor
  4. 拦截器loadBalancerInterceptor用注入的Ribbon负载均衡客户端实例实现负载均衡