当前位置:网站首页>Nacos是如何实现心跳机制和服务续约以及超时剔除服务机制的?
Nacos是如何实现心跳机制和服务续约以及超时剔除服务机制的?
2022-08-08 07:23:00 【步尔斯特】
上一篇文章 《Nacos是如何实现服务注册功能的》,我们全面解析了Nacos是如何实现服务注册的,那么这篇文章,就来看看Nacos是如何实现心跳机制和服务续约以及健康检查机制的。
心跳机制
客户端
nacos进行服务的注册之前,会进行判断:
- 如果当前客户端是临时的【
ephemeral: true】,则触发心跳机制,默认5秒发送一次心跳,如果15秒内没有收到心跳,那么会将这个服务更改为不健康的状态,如果30秒内仍然没有接收到心跳,则会从注册表中剔出该服务。 - 如果是永久的,则只会声明服务是否健康,不会剔除服务。
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
边栏推荐
猜你喜欢
随机推荐
seata内部是使用redisson的分布式锁来实现的吗?
Redis(4)-Redis遇到的问题
VISIO 2003 在线更新的注册文件
超强的企业建站系统介绍:功能模块
HCIA---OSPF实验
volatile在C语言中的基本使用方法
脑筋急转弯
PHR-search:一个基于预测蛋白质层次关系的蛋白质远程同源性检测搜索框
Properties文件的读取与保存
如何解决大团队需求交付周期长的问题?
云服务器搭建MQTT消息代理EMQX
蓝牙5.2新特性 - Enhance ATT
阿里巴巴需求交付全流程职责划分
BLE安全之配对流程剖析(1)
HCIA --- VLAN实验报告
JLink Commander调试方法
小程序 数据监听(observers),避免赋值死循环
物联网安全 - 密码学概述
IIC通讯协议与EEPROM简介
idea big data tools 提交flink任务









