首页 热点资讯 义务教育 高等教育 出国留学 考研考公

看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