上面已经大概了解了一下Nacos服务注册的逻辑,接下来来看看服务是如何被发现已经消费的。
一、服务发现前
目前在Spring Cloud,基本都是使用Feign去调用服务,Feign其实也是Ribbon的一个封装,主要功能,是将我们通常http请求服务这个过程帮我们封装起来,使我们使用时更加的简便,通过一个注解就能实现对服务的调用,对于ribbon的源码解析,参考这篇文章:
https://blog.csdn.net/forezp/article/details/74820899
文章讲的非常清楚了,这里大概总结一下,ribbon最最底层也是实现spring cloud common包下的
org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList
接口,主要是ServiceInstanceChooser 下的继承接口:
org.springframework.cloud.client.loadbalancer.LoadBalancerClient
这是Ribbon实现负载均衡的父类接口,接下来一系列的接口实现最终会落到如何获取serverList这个问题是,答案在这个接口:
com.netflix.loadbalancer.ServerList
接下来,就是服务发现组件的事情了,比如,eureka对于这个接口的实现就是
DiscoveryEnabledNIWSServerList
而,Nacos的实现就是:org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList,这也是我们的重点。
二、服务发现
上面主要是讲述了一下,服务发现的身世,Springcloud是如何走到获取服务列表这一步的,期间经过了ribbon的负载均衡,最后落到了Nacos的实现类NacosServerList中。来看代码
public class NacosServerList extends AbstractServerList<NacosServer> {
@Autowired
private NacosDiscoveryProperties discoveryProperties;
private String serviceId;
public NacosServerList() {
}
public NacosServerList(String serviceId) {
this.serviceId = serviceId;
}
@Override
public List<NacosServer> getInitialListOfServers() {
return getServers();
}
@Override
public List<NacosServer> getUpdatedListOfServers() {
return getServers();
}
private List<NacosServer> getServers() {
try {
List<Instance> instances = discoveryProperties.namingServiceInstance()
.getAllInstances(serviceId);
return instancesToServerList(instances);
}
catch (Exception e) {
throw new IllegalStateException(
"Can not get service instances from nacos, serviceId=" + serviceId,
e);
}
}
private List<NacosServer> instancesToServerList(List<Instance> instances) {
List<NacosServer> result = new ArrayList<>(instances.size());
for (Instance instance : instances) {
if (instance.isHealthy()) {
result.add(new NacosServer(instance));
}
}
return result;
}
public String getServiceId() {
return serviceId;