返回

Nacos 集群架构下心跳健康检查的设计原理

后端

Nacos集群架构下心跳健康检查的设计原理

前言

最近一直在研究Nacos开源框架的源码和执行流程原理。本次简单聊下AP集群架构下Nacos心跳设计原理。

Nacos客户端心跳健康上报源码

// 开启定时任务 向服务器上报心跳
private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

static {
    executor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            heartbeat();
        }
    }, HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS);
}

当客户端注册到Nacos服务端的同时会开启一个定时任务线程。在默认情况下,心跳间隔为5秒,即每隔5秒向Nacos服务端发送一次心跳。

客户端的心跳包中会包含以下信息:

  • 客户端ID
  • 服务名称
  • 服务分组
  • 服务实例IP
  • 服务实例端口
  • 服务实例健康状态
  • 服务实例元数据

服务端收到客户端的心跳包后,会将心跳包中的信息更新到本地内存中。如果在一定时间内(默认情况下为30秒)没有收到客户端的心跳包,则服务端会将该客户端实例标记为不健康。

当客户端实例被标记为不健康后,服务端会将该客户端实例从服务列表中剔除。此时,客户端将无法再向服务端发送心跳包,也不会再被服务端发现。

心跳健康检查的设计原理

Nacos集群架构下心跳健康检查的设计原理主要包括以下几个方面:

  1. 定时任务心跳上报

客户端会开启一个定时任务,每隔一段时间向服务端发送一次心跳包。

  1. 心跳包的内容

心跳包中包含客户端ID、服务名称、服务分组、服务实例IP、服务实例端口、服务实例健康状态和服务实例元数据等信息。

  1. 服务端心跳包处理

服务端收到客户端的心跳包后,会将心跳包中的信息更新到本地内存中。

  1. 客户端健康状态的判断

如果在一定时间内(默认情况下为30秒)没有收到客户端的心跳包,则服务端会将该客户端实例标记为不健康。

  1. 客户端实例的剔除

当客户端实例被标记为不健康后,服务端会将该客户端实例从服务列表中剔除。

心跳健康检查的设计细节

Nacos集群架构下心跳健康检查的设计细节主要包括以下几个方面:

  1. 心跳间隔的配置

心跳间隔可以在Nacos的配置文件中进行配置。默认情况下,心跳间隔为5秒。

  1. 心跳超时时间的配置

心跳超时时间也可以在Nacos的配置文件中进行配置。默认情况下,心跳超时时间为30秒。

  1. 心跳健康检查的实现

Nacos的心跳健康检查是通过心跳包来实现的。心跳包中包含客户端ID、服务名称、服务分组、服务实例IP、服务实例端口、服务实例健康状态和服务实例元数据等信息。

  1. 心跳健康检查的流程

客户端会开启一个定时任务,每隔一段时间向服务端发送一次心跳包。服务端收到客户端的心跳包后,会将心跳包中的信息更新到本地内存中。如果在一定时间内(默认情况下为30秒)没有收到客户端的心跳包,则服务端会将该客户端实例标记为不健康。当客户端实例被标记为不健康后,服务端会将该客户端实例从服务列表中剔除。

总结

Nacos集群架构下心跳健康检查的设计原理主要包括定时任务心跳上报、心跳包的内容、服务端心跳包处理、客户端健康状态的判断和客户端实例的剔除几个方面。Nacos的心跳健康检查是通过心跳包来实现的。心跳包中包含客户端ID、服务名称、服务分组、服务实例IP、服务实例端口、服务实例健康状态和服务实例元数据等信息。Nacos的心跳健康检查流程主要包括客户端开启定时任务发送心跳包、服务端收到心跳包后更新本地内存、客户端在一定时间内没有发送心跳包被标记为不健康、客户端被标记为不健康后被剔除出服务列表几个步骤。