返回
Nacos Client端获取所有服务请求
后端
2023-09-18 19:18:00
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中的服务注册信息。