• 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);
    
    • 1
    • 2
    • 3

    在这里插入图片描述

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

    executorService.schedule(new BeatTask(beatInfo), 
    							beatInfo.getPeriod(), 
    							TimeUnit.MILLISECONDS);
    
    • 1
    • 2
    • 3

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    服务续约

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

    ClientBeatProcessor#run

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

    在这里插入图片描述

    UdpPushService#serviceChanged

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

    UdpPushService#onApplicationEvent

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

    健康检查

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

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

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

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

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

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

  • 相关阅读:
    如何避免小程序被封
    CAN原理讲解,以及NVIDIA的tx2接收can消息,并进行can设置(开发实战二)
    Linux学习笔记(7)
    小问题--电脑开机一连上网就总是会安装各种软件的问题及解决
    Mongoose应用和文件上传
    关于 MyBatis-Plus 分页查询的探讨 → count 都为 0 了,为什么还要查询记录?
    python sklearn 多输出回归
    Java 复习笔记 - 常见算法:查找算法
    Cocos 进度条物体跟随效果
    MFC Windows 程序设计[261]之选项文档例程(附源码)
  • 原文地址:https://blog.csdn.net/CSDN_SAVIOR/article/details/126197859