我们只需要在RestTemplate的bean上面加入@LoadBalanced注解即可在使用RestTemplate发送HTTP请求时,自动实现负载均衡调用。
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
看起来挺神奇中,本节我们就讲一讲这背后发生了什么。
我们最能想到的就是@LoadBalanced这个注解起了作用, @LoadBalanced源码如下:
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Qualifier public @interface LoadBalanced { }
仔细看来没有什么特别之处,也没有像往常的注解引入其他类。按照常规惯例,我们就到引入的jar包下看下META-INF/spring.factories文件有没有引入什么特别的类。我们就到@LoadBalanced所在的jar包spring-cloud-commons-1.2.2.RELEASE-sources.jar来看下其spring.factories文件:
# AutoConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration= org.springframework.cloud.client.CommonsClientAutoConfiguration, org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration, org.springframework.cloud.client.hypermedia.CloudHypermediaAutoConfiguration, org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration, org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration, org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration, org.springframework.cloud.commons.util.UtilAutoConfiguration, org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration # Environment Post Processors org.springframework.boot.env.EnvironmentPostProcessor= org.springframework.cloud.client.HostInfoEnvironmentPostProcessor
AutoConfiguration引入的类都会在项目启动时被添加到Spring容器中,与LoadBalanced相关的的有两个,直觉上LoadBalancerAutoConfiguration更像我们需要看的类。