优秀的编程知识分享平台

网站首页 > 技术文章 正文

「一文搞懂」Nacos健康检查机制(nacos修改健康检查模式)

nanyue 2024-10-21 06:15:17 技术文章 6 ℃

本章内容

健康检查类型

Nacos根据服务实例类型提供了两种健康检查机制:

  • 临时实例:采用客户端主动上报心跳的方式进行健康检查。
  • 持久实例:采用服务端主动探测的方式进行健康检查。

服务实例类型配置方式:

server:
  port: 8081
spring:
  application:
    name: order-server
  cloud:
    nacos:
      discovery:
        # ephemeral值:true-临时实例,false-持久实例,默认为:true
        ephemeral: true

临时实例健康检查

发送实例心跳接口

请求协议:HTTP(2.x版本新增gRPC)

请求类型:PUT

请求路径:/nacos/v1/ns/instance/beat

请求参数

响应编码

客户端发送心跳请求

服务启动时,向Nacos服务发送服务注册请求,如果服务实例为临时实例,则会向Nacos服务端发送心跳请求。

客户端发送心跳请求,如图所示:

处理流程:

  • 1)服务启动时,向Nacos服务端发送服务注册请求,如果服务实例为临时实例,则会向Nacos服务端发送心跳请求。
  • 2)构建心跳信息。
  • 3)将心跳信息封装成Task(线程),并放入延时任务线程池中延时指定时间(默认为5秒)后向Nacos服务端发送心跳请求。
  • 4)根据服务端响应信息判断服务是否已注册,如果服务未注册,则向Nacos服务端发送服务注册请求。
  • 5)延迟指定时间后继续向Nacos服务端发送心跳请求(即:按指定周期向Nacos服务端发送心跳请求)。

服务端处理心跳请求

Nacos服务端收到客户端心跳请求后,调用心跳检测接口对应的处理方法处理心跳请求。

服务端心跳处理请求包含两个步骤:

  • 1)处理客户端心跳请求。
  • 2)定时检测服务实例是否已过期。

处理客户端心跳请求

处理客户端心跳请求,如图所示:

处理流程:

  • 1)接收客户端请求(即:调用InstanceController.beat()方法)。
  • 2)解析请求参数,并根据请求参数构建心跳信息对象(RsInfo对象)。
  • 3)根据namespaceId、serviceName、clusterName、ip、port等信息从注册表中获取服务实例信息,如果实例信息不存在,则根据心跳请求参数构建服务实例并向注册表中注册该服务实例。
  • 4)构建客户端心跳处理器(ClientBeatProcessor)对象封装客户端心跳信息。
  • 5)将客户端心跳处理器放入线程池(延时任务线程池,延时0秒,即:立即执行)中进行心跳处理。
  • 6)根据集群名、IP、Port等信息查找客户端对应的服务实例(即:发送心跳请求的服务实例)。
  • 7)更新服务实例最后一次心跳时间为系统当前时间。

定时检测服务实例是否已过期

定时检测服务实例是否已过期,如图所示:

处理流程:

  • 1)服务首次注册,创建服务对象并根据服务信息构建的心跳检测任务
  • 2)调用Service.init()方法,并开启一个定时任务以5秒/次的频率执行心跳检测任务。
  • 3)获取服务中的所有临时实例,判断实例最后一次心跳时间距离当前时间是否超过心跳检测超时时长(默认为15s),超过心跳检测超时时长,则设置服务实例的健康状态为false,并发布一个服务变更事件和心跳超时事件。
  • 4)判断实例最后一次心跳时间距离当前时间是否超过删除实例设定的超时时长(默认为30s),超过删除实例设定的超时时长,则将该实例从实例列表中移除。

持久实例健康检查

如果服务实例为持久实例,则服务端以主动探测的方式定时向服务实例发送请求,检查服务的健康状态。

持久实例健康检查,如图所示:

处理流程:

  • 1)服务首次注册时,创建服务并初始化集群信息(即:调用Cluster.init()方法)。
  • 2)根据集群信息构建健康检查任务(HealthCheckTask),并开启一个延时任务延时(2000毫秒 + 5000毫秒内的随机数)后执行健康检查任务。
  • 3)遍历服务下所有的持久实例,创建Beat对象封装持久实例和对应的健康检查信息。
  • 4)将Beat对象加入到任务队列(阻塞队列)中。
  • 5)不停的从任务队列中取出健康检查任务,并将其封装成任务处理器(TaskProcessor)对象加入到tasks集合中。
  • 6)批量执行tasks集合中的任务处理器,向服务(客户端)发送请求检查服务健康状态。
  • 7)延时指定周期后继续向服务发送请求进行健康检测。

Nacos与Eureka区别

Nacos与Eureka健康检查主要区别:

  • Eureka以30秒/次的频率对服务实例进行健康检查。
  • Nacos将服务实例分为临时实例和持久实例:
    • 临时实例:以5秒/次的频率对服务实例进行健康检查。
    • 持久实例:服务端按指定周期(2000毫秒 + 5000毫秒内的随机数)对服务实例进行主动探测。

【阅读推荐】

更多精彩内容(如:Redis、数据结构与算法、Nacos、G1垃圾回收器、CMS垃圾回收器、MySQL、Kafka等)请移步【南秋同学】个人主页进行查阅。

【作者简介】

一枚热爱技术和生活的老贝比,专注于Java领域,关注【南秋同学】带你一起学习成长~

最近发表
标签列表