问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

看Spring-cloud怎样使用Ribbon

发布网友 发布时间:2022-04-21 14:53

我来回答

1个回答

热心网友 时间:2022-04-08 00:14

关注下spring cloud是如何进行客户端负责均衡。 看怎么调用到负载均衡的,怎么定义负载均衡的,然后是怎么实现的?

第一个其实可以不用关心,调用的地方应该很多,找到一个地方来说明怎么调用的即可。 第二个,可以猜下,最主要的应该是一个类似
serviceInstance get(string serviceId)这样的方法吧。
第三个问题,明摆着,使用netflix的ribbon呗。

发起一个调用时,LB对输入的serviceId,选择一个服务实例。

org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory.createRequest
throws IOException {
String serviceId = originalUri.getHost();
ServiceInstanceinstance = loadBalancer.choose(serviceId);
URIuri = loadBalancer.reconstructURI(instance, originalUri);
IClientConfigclientConfig = clientFactory.getClientConfig(instance.getServiceId());
RestClientclient = clientFactory.getClient(instance.getServiceId(), RestClient.class);
HttpRequest.Verbverb = HttpRequest.Verb.valueOf(httpMethod.name());
return new RibbonHttpRequest(uri, verb, client, clientConfig);
}

关键代码看到调用的是一个LoadBalancerClient的choose方法,对一个serviceId,选择一个服务实例。看下LoadBalancerClient是一个接口:

足够简单,只定义了三个方法,根据一个serviceId,由LB选择一个服务实例。reconstructURI使用Lb选择的
serviceinstance信息重新构造访问URI,能想来也就是用服务实例的host和port来加上服务的路径来构造一个真正的刘访问的真正服务
地址。

可以看到这个类定义在spring-cloud-commons.jar的package
org.springframework.cloud.client.loadbalancer下面,满篇不见ribbon字样。只有
loadbalancer,即这是spring-cloud定义的loadbalancer的行为,至于ribbon,只是客户端LB的一种实现。

Ribbon的实现定义在spring-cloud-netflix-core.jar中的
org.springframework.cloud.netflix.ribbon包下的RibbonLoadBalancerClient。看下
RibbonLoadBalancerClient中choose(String serviceId)方法的实现。

ServiceInstanceorg.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(String serviceId)
@Override
public ServiceInstancechoose(String serviceId) {
Serverserver = getServer(serviceId);
return new RibbonServer(serviceId, server, isSecure(server, serviceId),
serverIntrospector(serviceId).getMetadata(server));
}

看到,最终调到的是ILoadBalancer的chooseServer方法。即netflix的LB的能力来获取一个服务实例。

protected ServergetServer(String serviceId) {
return getServer(getLoadBalancer(serviceId));
}
protected ServergetServer(ILoadBalancerloadBalancer) {
return loadBalancer.chooseServer(“default”); ofkey
}

至于netflix如何提供这个能力的在另外一篇博文中尝试解析下。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 小米移动电源2和小米移动电源2C到底有何差别 办公系统oa免费版有哪些,哪个好 免费OA办公系统哪家比较好 免费oa系统那个好用些? oa办公软件排名有哪些? 求助:oa办公软件排行榜 哪个免费OA系统靠谱 免费oa办公系统哪个好 OA系统哪个品牌比较好? 政府办公oa系统排行榜,谁有吗? 2020年高校oa办公系统排名有哪些? 免费oa办公系统哪个好 有什么好的oa软件? 大家知道OA系统的排行榜吗? 充电宝为什么红米比小米便宜 微信一天能转多少钱 360浏览器老是弹出网游网页,怎么办 360安全浏览器老是跳出来广告? 为什么最迷人的最危险是什么歌曲 如何关闭360浏览器自带的360游戏 广告 什么求组词 zuulfilter 怎么使用环境变量 nuc6i7kyk更换cpu nuc6i7kykbios如何恢复 英特尔 nuc nuc6i7kyk可以玩lol吗 索泰/ZBOX EN1060 i5和特尔骷髅峡谷 NUC6i7KYK 6代酷睿I7 选哪一个呢?谁强 Intel Skull Canyon NUC6i7KYK 接2K及4K显示器黑屏,操作系统是WIN10,64位, Intel/英特尔NUC6I7KYK 换内存 nuc6i7kyk 里面有没有带电源线 nuc6i5和nuc5i7选哪一个 想买台英特尔NUC 7代,I3和I5区别大吗 intel的NUC,dell的7040m,选哪个 intel 酷睿i7 3610qm相当于啥 我装PVELITE 时,怎么用SPLM软件时让用虚拟的IP? nuc5i5ryk支持nvme硬盘吗 求php解密eval(gzinflate(base64_decode 404 Not Found 求造梦3极品号 造梦西游3谁给我复制个厉害点的悟空号源? 小米移动电源和小米移动电源和小米移动电源有什么区别