源码探索之@LoadBalanced注解工作原理
@LoadBalanced所在依赖包
测试项目所用包spring-cloud-commons:
@LoadBalanced源码
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
@LoadBalanced的使用
在使用微服务框架时,通过ribbon
实现多服务之间的负载均衡,需要对RestTemplate
bean对象加上@LoadBalanced
注解即可,如下:
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
@LoadBalanced注解加上后有了什么变化?
查找该注解的使用类,可以看到有2个
1.AsyncLoadBalancerAutoConfiguration类
2.LoadBalancerAutoConfiguration类
可以看到,这2个负载均衡自动配置类
有个明显的注解差别,配置类2的注解中多了一个@ConditionalOnClass(RestTemplate.class)
,该注解的意思是:当项目中有RestTemplate.class
类时,该配置类才会生效!
3.关注LoadBalancerAutoConfiguration类
3.1代码
标记1处,注入有@LoadBalanced
注解的RestTemplate
bean对象;
标记2处,给RestTemplate
注入拦截器loadBalancerInterceptor
;
标记4处,注入负载均衡实例。
3.2拦截器loadBalancerInterceptor
标记3处,执行负载均衡对象请求服务实例的动作。
Debug模式看看上述标记4
处该负载均衡对象是哪个实例,如下:
可以看的是由Ribbon实现的负载均衡。
总结
- 使用
Ribbon
做负载均衡,代码配置RestTemplate
,并加上@LoadBalanced
注解 - 被
@LoadBalanced
注解的RestTemplate
bean对象被注入到LoadBalancerAutoConfiguration
类管理 -
LoadBalancerAutoConfiguration
类给RestTemplate
对象添加默认拦截器loadBalancerInterceptor
- 拦截器
loadBalancerInterceptor
用注入的Ribbon负载均衡客户端
实例实现负载均衡