Nacos Client 从Ribbon负载均衡调用服务。
1.Nacos Client获取调用服务的提供者列表
1.1 从Ribbon的负载均衡入手到Nacos Client获取调用服务的提高者列表
RibbonClientConfiguration#ribbonLoadBalancer()
@Bean
@ConditionalOnMissingBean
public ILoadBalancer ribbonLoadBalancer(IClientConfig config,
ServerList<Server> serverList, ServerListFilter<Server> serverListFilter,
IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
if (this.propertiesFactory.isSet(ILoadBalancer.class, name)) {
return this.propertiesFactory.get(ILoadBalancer.class, config, name);
}
return new ZoneAwareLoadBalancer<>(config, rule, ping, serverList,
serverListFilter, serverListUpdater);
}
1.2 getServers方法返回分析
从NacosNamingService中获取instance, 最后加入到Server的list中。
private List<NacosServer> instancesToServerList(List<Instance> instances) {
List<NacosServer> result = new ArrayList<>();
if (null == instances) {
return result;
}
for (Instance instance : instances) {
result.add(new NacosServer(instance));
}
return result;
}
通过遍历传入的Instances, 加入至NacosServer队列中。
1.3 通过selectInstances方法查找Instances实例
NacosServerList#getServers() -> NacosNamingService#selectInstances() 3个参数 -> 4个参数 -> 5个参数
通过参数判断实例是否是安全的, 是否是订阅请求
5个参数的方法去获取到要调用服务的serviceInfo Client获取要调用服务的提供者列表
最后通过selectInstances()两个参数的方法去过滤出所有可用的实例
通过迭代服务的所有instance实例, 判断当前instance是否是不是健康的,或不可用,或其权重小于等于0,则从列表中将其删除
1.4 获取到要调用服务的serviceInfo
此方法之前分析过, 先获取本地的服务。此方法最后有一个定时任务, 去定时更新本地注册表中的当前服务。
创建一个定时异步操作对象,并启动这个定时任务, 将这个定时异步操作对象写入到缓存map。