Spring cloud 使用-@LoadBalanced
@LoadBalanced
前面已经说了,在RestTemplatebean上添加@LoadBalanced注解,可以有原先的ip:port转成微服务名调用。现在我们来看下 他是怎么由微服务解析成ip:port的。
解析过程
点到注解里,可以看到是在spring-cloud-common中的。

我能发现还有个类是LoadBalancerInterceptor,他实现了ClientHttpRequestInterceptor接口
public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
URI originalUri = request.getURI();
String serviceName = originalUri.getHost();
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
}
通过request.getURI()和originalUri.getHost()取到了当前请求的微服务调用

http://consumerservice/consumer/1和consumerservice,之后使用loadBalancer.execute去执行下一步

通过getHint(serviceId)取到当前使用的负载均衡策略,若是没有配置 则为default,执行choose(serviceId, lbRequest),选择要调用的微服务(可以理解为要调用的消费者)。
choose方法中

通过loadBalancerClientFactory.getInstance(serviceId)当前的负载策略是RoundRobinLoadBalancer,也就是 加权随机数
最终选到某一个提供者上,也就是当前 18081端口的这个

execute(serviceId, serviceInstance, lbRequest)方法执行


浙公网安备 33010602011771号