返回

Nacos Client端获取所有服务请求

后端

Nacos Client端获取所有服务请求,入口类DiscoveryClientHealthIndicator#health,其在Nacos中被用来监测服务状态,包括服务注册和注销,并负责管理本地缓存的服务实例。
DiscoveryClientHealthIndicator类为HealthIndicator接口的实现类,是一个所有服务状态的聚合对象,通过调用HealthIndicator#getServiceInstances()方法可以获取所有服务的列表。

public final class DiscoveryClientHealthIndicator
        extends HealthIndicator {
    // 服务发现客户端
    private final NacosDiscoveryClient nacosDiscoveryClient;
    private final HealthIndicatorRegistry healthIndicatorRegistry;
    private static final ExecutorService HEALTH_INDICATOR_EXECUTOR =
            new ThreadPoolExecutor(0, 1,
                    60L, TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>(100),
                    ThreadFactoryUtils.buildThreadFactory("NacosDiscoveryClientHealthIndicator", true));

    public DiscoveryClientHealthIndicator(NacosDiscoveryClient nacosDiscoveryClient,
                                         HealthIndicatorRegistry healthIndicatorRegistry) {
        this.nacosDiscoveryClient = nacosDiscoveryClient;
        this.healthIndicatorRegistry = healthIndicatorRegistry;
        // 注册一个线程池,该线程池用于定时执行health()方法
        HEALTH_INDICATOR_EXECUTOR.execute(new PeriodicHealthIndicatorRunner(this::health));
    }

    @Override
    public Health.Builder doHealthCheck(Health.Builder builder) {
        builder.withService(getServiceInstances()).up();
        return builder;
    }

    public Set<ServiceInstance> getServiceInstances() {
        List<ServiceInstance> result = Collections.emptyList();
        try {
            result = healthIndicatorRegistry.getAll();
        }
        catch (Exception e) {
            logger.error("Get service instances error", e);
        }
        return new CopyOnWriteArraySet<>(result);
    }

}

当调用DiscoveryClientHealthIndicator#getServiceInstances()方法时,该方法会委托给HealthIndicatorRegistry#getAll()方法,从而获取所有服务的列表。HealthIndicatorRegistry是一个Map对象,其以服务名为键,以服务实例列表为值,保存着所有服务的注册信息。

当调用DiscoveryClientHealthIndicator#health()方法时,该方法会委托给DiscoveryClientHealthIndicator#getServiceInstances()方法,获取所有服务的列表,并将其返回给HealthIndicatorRegistry#getAll()方法,从而更新HealthIndicatorRegistry中的服务注册信息。