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/1consumerservice,之后使用loadBalancer.execute去执行下一步

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

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

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

posted @   Geoary  阅读(393)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示