看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如何提供这个能力的在另外一篇博文中尝试解析下。