04、Nacos源码分析-Client获取调用服务的提供者列表

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);
    }

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

1.2 getServers方法返回分析

&nbsp;

&nbsp;

从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实例

&nbsp;

NacosServerList#getServers() -> NacosNamingService#selectInstances() 3个参数 -> 4个参数 -> 5个参数
通过参数判断实例是否是安全的, 是否是订阅请求

&nbsp;

5个参数的方法去获取到要调用服务的serviceInfo Client获取要调用服务的提供者列表

&nbsp;

最后通过selectInstances()两个参数的方法去过滤出所有可用的实例

&nbsp;

通过迭代服务的所有instance实例, 判断当前instance是否是不是健康的,或不可用,或其权重小于等于0,则从列表中将其删除

1.4 获取到要调用服务的serviceInfo

&nbsp;

此方法之前分析过, 先获取本地的服务。此方法最后有一个定时任务, 去定时更新本地注册表中的当前服务。

&nbsp;

创建一个定时异步操作对象,并启动这个定时任务, 将这个定时异步操作对象写入到缓存map。