Nacos健康检查机制

本章内容

健康检查类型

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服务端发送心跳请求(即:定时向Naco服务端发送心跳请求)。

服务端处理心跳请求

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

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

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

处理客户端心跳请求

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

处理流程:

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

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

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

处理流程:

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

持久实例健康检查

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

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

处理流程:

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

Nacos与Eureka区别

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

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

【作者简介】

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值