Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

2023-11-07

0 前言

注册中心不应仅提供服务注册和发现功能,还应保证对服务可用性监测,对不健康的服务和过期的进行标识或剔除,维护实例的生命周期,以保证客户端尽可能的查询到可用的服务列表。

因此本文介绍Nacos注册中心的健康检查机制。

1 注册中心的健康检查机制

知道⼀个服务是否还健康的方式:

  • 客户端主动上报,告诉服务端自己健康状态,如果在⼀段时间没有上报,那么我们就认为服务已经不健康
  • 服务端主动向客户端进行探测,检查客户端是否还被能探测到

如你在废墟中大声呼叫救援队并且提供你的位置和健康信息,相比搜救队用探测设备挨着废墟探测会使探测队的工作量减轻很多,他可专注尽快将你救出。好比注册中心对服务健康状态的检测,如所有服务都要注册中心主动探测,由于服务的数量远大于注册中心的数量,那么注册中心的任务量将会比较巨大。那就都采用服务主动上报健康检查。那如果在废墟之下的我们因为身体状况无法呼救,那么搜救队就会放弃搜救了吗?当然不是,搜救队肯定也会对废墟进行全面探测将你救出。如服务本身就没法主动进行健康上报,那么这个时候注册中心主动检查健康状态就有用武之地。

在当前主流的注册中心,对健康检查机制主要都采用TTL(Time To Live),即客户端在⼀定时间没向注册中心发心跳,注册中心认为此服务不健康,进而触发后续剔除逻辑。

对主动探测,根据不同场景,要采用的方式有不同。

Nacos 健康检查机制

既然以上两种健康检查机制都有应用的场景,且适用场景不⼀致,Nacos 对健康检查的机制如何抉择?

2 Nacos服务的特点

Nacos 提供两种服务类型供用户注册实例时选择:

  • 临时实例,临时存在于注册中心,在服务下线或不可用时被注册中心剔除。临时实例会与注册中心保持心跳,注册中心在⼀段时间没收到来自客户端的心跳后就将实例设置为不健康,然后在⼀段时间后剔除
  • 永久实例在被删除之前会永久的存在于注册中心,且可能不知道注册中心存在,不会主动向注册中心上报心跳,这时就要注册中心主动探活

可见Nacos两种健康探测方式均有被使用,Nacos监看检查的整体交互如下:

来看Nacos对两种实例的健康检查机制。

3 临时实例健康检查机制

可通过两种方式进行临时实例注册,通过:

  • Nacos 的 OpenAPI
  • 或 Nacos 提供的 SDK

进行服务注册,OpenAPI注册方式实际是用户根据自身需求调 Http 接口对服务进行注册,然后通过 HTTP 接口发送心跳到注册中心。在注册服务同时会注册⼀个全局的客户端心跳检测的任务。在服务⼀段时间没有收到来自客户端的心跳后,该任务会将其标记为不健康,如果在间隔的时间内还未收到心跳,那么该任务会将其剔除。

SDK注册方式实际是通过 RPC 与注册中心保持连接(Nacos 2.x中,旧版还是仍通过OpenAPI),客户端会定时通过 RPC 连接向 Nacos 注册中心发心跳,保持连接的存活。如客户端和注册中心的连接断开,注册中心会主动剔除该 client 所注册的服务,达到下线效果。

Nacos 注册中心还会在注册中心启动时,注册⼀个过期客户端清除的定时任务,删除那些健康状态超过⼀段时间的客户端。

对不同类型使用方式,Nacos 对健康检查的特点都相同,都是由客户端向注册中心发送心跳,注册中心会在连接断开或是心跳过期后将不健康的实例移除。

4 永久实例健康检查机制

Nacos 中使用 SDK 对于永久实例的注册实际也是使用 OpenAPI 的方式进行注册,这样可以保证即使客户端下线后也不会影响永久实例的健康检查。

永久实例的的监看检查,Nacos采用注册中心探测机制,注册中心会在永久服务初始化时,根据客户端选择的协议类型注册探活的定时任务。Nacos 现在内置提供了三种探测的协议,即Http、TCP 及 MySQL 。

MySQL 主要用于特殊业务场景,如数据库的主备需通过服务名对外提供访问,需要确定当前访问数据库是否为主库时,那么我们此时的健康检查接口,是⼀个检查数据库是否为主库的 MySQL命令。

因为持久化服务的实例的在被主动删除前⼀直存在,探活的定时任务会不断探测服务健康状态,并将无法探测成功的实例标为不健康。

但有时:有些服务不希望校验其健康状态,Nacos 也提供白名单配置,用户可将服务配置到该白名单,Nacos放弃对其健康检查,实例健康状态始终为用户传入的健康状态。

5 集群模式下的健康检查机制

完整的注册中心应具备高可用,即注册中心可集群部署作为⼀个整体对外服务。不同于单机部署,集群部署中我们的客户端只和其中⼀个注册中心服务保持链接和请求,但我们的服务信息需要注册到所有的服务节点上,在其他客户端从任意⼀个注册中心服务获取服务列表时始终是所有的服务列表。此时Nacos在集群模式下又如何对不是和自己保持心跳连接的服务进行健康检查?

对集群下的服务,Nacos⼀个服务只会被 Nacos 集群中的⼀个注册中心负责,其余节点的服务信息只是集群副本,用于订阅者在查询服务列表时,始终可获取到全部服务列表。临时实例只对其被负责的注册中心节点发送心跳信息,注册中心服务节点会对其负责的永久实例进行健康探测,在获取到健康状态后由当前负责的注册中心节点将健康信息同步到集群中的其他的注册中心。

服务的注册从注册方式维度可分:

  • 通过 SDK RPC 连接进行注册,客户端会和注册中心保持链接
  • 通过 OpenAPI 进行 IP 和端口注册

第⼀类如何找到对其负责的注册中心节点?只需和注册中心集群的任⼀台节点建立联系,由这节点负责这客户端。注册中心会在启动时注册⼀个全局的同步任务,将其当前负责的所有节点信息同步到集群中其他节点,其他非负责的节点也会创建该客户端的信息,在非负责的节点上,连接类型的客户端,会有续约时间,在收到其他节点的同步信息时,更新续约时间为当前时间,如在集群中的其他节点⼀段时间内没收到不是自己的负责的节点的同步信息,那认为此节点已不健康,从而达到对不是自己负责的节点健康状态检查。

第二类方式也基本和第⼀类⼀致,OpenAPI 注册的临时实例也是通过同步自身负责的节点到其他节点来更新其他节点的对应的临时实例的心跳时间,保证其他节点不会删除或者修改此实例的健康状态。前面我们特别指明了是临时实例而没有说所有实例,你应该也可能会想到这种方式对于持久化节点会显得多余,永久实例会在被主动删除前⼀直存在于注册中心,那么我们健康检查并不会去删除实例,所以我们只需要在负责的节点永久实例健康状态变更的时候通知到其余的节点即可。

6 总结

本文从注册中心场景展开,详细介绍 Nacos 注册中心的健康检查机制。

Nacos针对不同类型的服务,使用不同健康检查方式进行实例生命周期维护,⼀致性协议使 Nacos 节点均保持实例生命周期的⼀致。

Nacos 注册中心集群中,实例的健康状态和生命周期需要保持⼀致,因此后文介绍 Nacos 注册中心是如何使用 Nacos 的⼀致性协议,来保持数据模型及生命周期⼀致。

本文由博客一文多发平台 OpenWrite 发布!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行! 的相关文章

  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • Docker部署 registry

    系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c
  • 使用WebSocket实现服务端向指定的客户端推送消息

    写这篇博客记录一下自己在用websocket的时候遇到的坑 需求是这样的 需要将activeMq来的数据利用websockt推送给客户端显示出来 有多个服务终端 需要将不同的消息推送到对应的服务终端上 1 服务端代码 需要写一个WebSoc
  • Eureka测试环境、开发环境服务宕机不踢掉处理

    SpringCloud eureka 服务宕机踢掉演示DEMO 版本信息 br springboot 1 5 9 br springcloud Dalston RC1 br 贴重点配置 br server br aidl eureka in
  • 使用Go Test测试单个文件和单个方法

    前置条件 1 文件名须以 test go 结尾 2 方法名须以 Test 打头 并且形参为 t testing T 举例 hello test go package main import testing fmt func TestHell
  • 【Android】在android中配置orientation

    参考资料 横竖屏切换 Activity 清单文件中不设置android configChanges属性时 先销毁onPause onStop onDestroy 再重新创建onCreate onStart onResume 方法 也可以 设
  • 程序员学习网站

    包括框架学习 涉及到Google源码的介绍 转载于 http www ha97 com 2908 html 程序员一般都会浏览哪些网站 转载于 http www ha97 com 2908 html 极客导航 转载于 http www go
  • RMQ(区间最值查询问题)

    简介 RMQ Range Minimum Maximum Query 问题是指 对于长度为 n 的数列 A 回答若干询问 RMQ A i j i j n 返回数列A中下标在 i j 里的最小 大 值 也就是说 RMQ问题是指求区间最值的问题
  • 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

    云服务器是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务 通常来说 平台的每个集群节点被部署在互联网的骨干数据中心 可以独立提供计算 存储 在线备份 托管 带宽等互联网基础设施服务 关注的是高性能吞吐量计算能力 关注的是在一段时间内的
  • 多网卡的情况下收udp组播数据的坑

    多网卡的情况下收udp组播收不到 有可能是如下原因造成 https www cnblogs com xiaouisme p 12658554 html
  • 【设计】OOA、OOD、OOP

    这三者都是 OO Object Oriented 领域的思想 一般我们我们接到产品经理的需求后 开发阶段分这样几个步骤 可行性预研阶段 此阶段评估需求是否合理 能否实现 OOA阶段 此阶段分析用例 定义领域模型 OOD阶段 此阶段定义类图
  • Chat 插件上线,免注册即可使用~

    OpenAI 新上线的 Chat 可谓是火爆出圈 这个语言对话模型可以回答问题 承认错误 挑战不正确的前提 还能帮你修改代码中的 bug Chat 的应用场景很广泛 它可以用于处理多种类型的对话 包括对话机器人 问答机器人和客服机器人等 它
  • 几种常用时钟分频实现方法

    在我们学习中 常常需要对时钟进行分频处理 本文将介绍几种常用分频方法 一 2的整数次幂分频 这种分频很简单 只需要设置一个计数器 对计数器进行计数 计数器的第i位则对应的2的i 1次幂分频 此方法适用于占空比为1 2 如果占空比不为1 2
  • CentOS7安装Docker详细步骤

    查看此文章前强烈建议先看这篇文章 Java江湖路 专栏目录 前言 记录在CentOS7中安装docker的每一个步骤 1 Docker介绍 什么是docker 虚拟化容器技术 Docker基于镜像 可以秒级的启动各种容器 每一种容器都是一个
  • 使用cloudflare-pages托管网站

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 如何白嫖省心的CloudFlare Pages服务 完美替代Github Pages 对大陆网络友好 背景 之前自己重新开始写博客了 为了方便本地md笔记 参考个人笔
  • [Orangepi 3 LTS]学习记录(一)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 准备香橙派开发板 闪迪TF卡 性能会更好一些 TF读卡器 USB转TTL模块 串口调试 HDMI 桌面登录 一 镜像安装 1 版本选择 下载对
  • WAF防火墙

    添加依赖 一下看情况而添加 不确定需不需要 apt get install gcc libpcre3 libpcre3 dev zlib1g dev tengine依赖 sudo apt get install openssl libssl
  • Nginx里的root/index/alias/proxy_pass的意思

    1 alias 别名配置 用于访问文件系统 在匹配到location配置的URL路径后 指向 alias 配置的路径 如 注意alias配置最后一定要有 而root可以没有 location test alias home sftp img
  • LEFT JOIN 和JOIN 多表连接

    转载 https blog csdn net mccand1234 article details 51734713 四张表contract customer customer3 customer4 这是比较熟悉的3张表的连接 SELECT
  • three.js全景视频

    小生最近学习three js 将three js官网提供的网站实例翻译翻译 共同学习 接下来翻译一下 webgl video panorama equirectangular html 运行结果https threejs org examp
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

    0 前言 注册中心不应仅提供服务注册和发现功能 还应保证对服务可用性监测 对不健康的服务和过期的进行标识或剔除 维护实例的生命周期 以保证客户端尽可能的查询到可用的服务列表 因此本文介绍Nacos注册中心的健康检查机制 1 注册中心的健康检