Nacos是如何实现心跳机制和服务续约以及超时剔除服务机制的?


上一篇文章 《Nacos是如何实现服务注册功能的》,我们全面解析了Nacos是如何实现服务注册的,那么这篇文章,就来看看Nacos是如何实现心跳机制和服务续约以及健康检查机制的。

心跳机制

客户端

nacos进行服务的注册之前,会进行判断:

  1. 如果当前客户端是临时的【ephemeral: true】,则触发心跳机制,默认5秒发送一次心跳,如果15秒内没有收到心跳,那么会将这个服务更改为不健康的状态,如果30秒内仍然没有接收到心跳,则会从注册表中剔出该服务。
  2. 如果是永久的,则只会声明服务是否健康,不会剔除服务。

NacosNamingService#registerInstance

在这里插入图片描述

BeatReactor#addBeatInfo

【这里用定时线程池,在task中有递归调用了本线程,用来做定时任务,定时发送心跳】

默认5秒发送一次心跳,

executorService.schedule(new BeatTask(beatInfo), 
							beatInfo.getPeriod(), 
							TimeUnit.MILLISECONDS);

在这里插入图片描述

BeatReactor#run
在这里插入图片描述
最后又调用了

executorService.schedule(new BeatTask(beatInfo), 
							beatInfo.getPeriod(), 
							TimeUnit.MILLISECONDS);

NamingProxy#sendBeat

在这里插入图片描述

服务端
InstanceController#beat
在这里插入图片描述

InstanceOperatorClientImpl#handleBeat

在这里插入图片描述

Service#processClientBeat

这个定时任务是无延时的

/**
 * Schedule client beat check task without a delay.
 *
 * @param task health check task
 * @return scheduled future
 */
public static ScheduledFuture<?> scheduleNow(Runnable task) {
    
    
    return GlobalExecutor.scheduleNamingHealth(task, 0, TimeUnit.MILLISECONDS);
}

在这里插入图片描述

服务续约

如果发现服务为不健康状态,恢复成健康

ClientBeatProcessor#run

如果此时实例存在,刷新最后一次的心跳时间,并且如果其为不健康状态,则更改为健康状态

在这里插入图片描述

UdpPushService#serviceChanged

public void serviceChanged(Service service) {
    
    
    this.applicationContext.publishEvent(new ServiceChangeEvent(this, service));
}

UdpPushService#onApplicationEvent

通过udp通知广播通知所有client,有instance发生了变更。
在这里插入图片描述

健康检查

发生时机:在第一次注册服务的时候,发生在 将注册信息存入注册表中 之后【服务端】

ServiceManager#putServiceAndInit
在这里插入图片描述

健康检查
在这里插入图片描述
核心业务

如果当前时间 - 最后发送心跳的时间 > 心跳超时时间 ,那么将服务更改为不健康状态
在这里插入图片描述

如果当前时间 - 最后发送心跳的时间 > 服务剔除时间 ,那么将服务从注册表剔除

在这里插入图片描述
调用删除服务的API
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_SAVIOR/article/details/126197859