Nacos架构与原理 - 健康检查机制

news2025/2/9 9:03:11

文章目录

  • 注册中心的健康检查机制
  • Nacos 健康检查机制
    • 临时实例健康检查机制
    • 永久实例健康检查机制
    • 集群模式下的健康检查机制

在这里插入图片描述


注册中心的健康检查机制

想象发生地质灾害,被掩埋在废墟下,搜救队需定位才能施救。两种方法:

  • 大喊求救,告知位置与健康状况,让搜救队知晓
  • 搜救队使用专业设备探测到被埋者位置

这两种方法可类比为服务探测方式:

  • 客户端主动上报,告知服务端自己健康状态。若一段时间无上报,判定服务不健康。
  • 服务端主动探测客户端,检查其是否可探测。

总之,实际案例比喻说明两种服务健康检查方式:

  • 客户端主动上报状态,无上报判定异常
  • 服务端主动探测客户端

前者依赖客户端自我报告,较易失效或延迟发现问题。后者由服务端定期检查,可更快准确发现客户端异常。但也增加服务端负载。

两种方式各有优劣,实际选择根据系统需求定制或混合使用。要点是确保服务健康状态被有效监控,问题能够及时发现。

可通过此例子理解常见的服务健康检查机制,两种方式的原理、特征与适用场景。在设计服务监控时,需考虑方式的优劣选择与定制需求,从而实现最优监控效果。

在这里插入图片描述

• 比喻场景中,主动呼救并报告位置与状态,可减轻搜救队工作量,专注救出。
• 类比服务健康检查,所有服务需要注册中心主动探测,任务量太大,考虑服务主动上报检查。
• 但如果呼救无力,搜救队仍会全面探测救出。
• 类比为服务本身无法主动上报,注册中心主动检查有用。
• 总之,主动上报模式减轻注册中心负载,但服务端无法主动上报时,注册中心主动检查必要。
• 前者适用于大多数正常服务,后者为少数异常服务提供保障。两种方式结合,可实现服务健康有效监控。
• 比喻清晰表达两种方式的作用与适用场景。正常情况下主动上报为主,异常情况由主动检查补充。注意两种方式的配合使用,实现完备监控。

在这里插入图片描述
在当前主流的注册中心,对于健康检查机制主要都采用了 TTL(Time To Live)机制,即客户端在⼀定时间没有向注册中心发送心跳,那么注册中心会认为此服务不健康,进而触发后续的剔除逻辑。

对于主动探测的方式那么根据不同的场景,需要采用的方式可能会有不同


Nacos 健康检查机制

在介绍 Nacos 的健康检查机制之前,我们先回顾⼀下 Nacos 服务有什么特点。Nacos 提供了两种服务类型供用户注册实例时选择,分为临时实例和永久实例。

  • 临时实例只是临时存在于注册中心中,会在服务下线或不可用时被注册中心剔除,临时实例会与注册中心保持心跳,注册中心会在⼀段时间没有收到来自客户端的心跳后会将实例设置为不健康,然后在⼀段时间后进行剔除。

  • 永久实例在被删除之前会永久的存在于注册中心,且有可能并不知道注册中心存在,不会主动向注册中心上报心跳,那么这个时候就需要注册中心主动进行探活

从上面的介绍我们可以看出,Nacos 中两种健康探测方式均有被使用,Nacos 中监看检查的整体交互如下如所示。下面我们会详细介绍 Nacos 中对于两种实例的健康检查机制。

在这里插入图片描述

临时实例健康检查机制

在 Nacos 中,用户可以通过两种方式进行临时实例的注册,通过 Nacos 的 OpenAPI 进行服务注册或通过 Nacos 提供的 SDK 进行服务注册。

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

  • SDK 的注册方式实际是通过 RPC 与注册中心保持连接(Nacos 2.x 版本中,旧版的还是仍然通过OpenAPI 的方式),客户端会定时的通过 RPC 连接向 Nacos 注册中心发送心跳,保持连接的存活。如果客户端和注册中心的连接断开,那么注册中心会主动剔除该 client 所注册的服务,达到下线的效果。同时 Nacos 注册中心还会在注册中心启动时,注册⼀个过期客户端清除的定时任务,用于删除那些健康状态超过⼀段时间的客户端。

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

在这里插入图片描述


永久实例健康检查机制

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

对于永久实例的的监看检查,Nacos 采用的是注册中心探测机制,注册中心会在永久服务初始化时根据客户端选择的协议类型注册探活的定时任务。Nacos 现在内置提供了三种探测的协议,即Http、TCP 以及 MySQL 。⼀般而言 Http 和 TCP 已经可以涵盖绝大多数的健康检查场景。

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

在这里插入图片描述

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

但是有些时候会有这样的场景,有些服务不希望去校验其健康状态,Nacos 也是提供了对应的白名单配置,用户可以将服务配置到该白名单,那么Nacos 会放弃对其进行健康检查,实例的健康状态也始终为用户传入的健康状态。


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

在这里插入图片描述

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

在 Nacos 中,服务的注册我们从注册方式维度实际可以分为两大类。第⼀类通过 SDK RPC 连接进行注册,客户端会和注册中心保持链接。第二类,通过 OpenAPI 进行 IP 和端口注册。

第一类SDK方式

在这里插入图片描述
只需要和注册中心集群中的任意⼀台节点建立联系,那么由这个节点负责这个客户端就可以了。注册中心会在启动时注册⼀个全局的同步任务,用于将其当前负责的所有节点信息同步到集群中的其他节点,其他非负责的节点也会创建该客户端的信息,在非负责的节点上,连接类型的客户端,会有⼀个续约时间的概念,在收到其他节点的同步信息时,更新续约时间为当前时间,如果在集群中的其他节点在⼀段时间内没有收到不是自己的负责的节点的同步信息,那么认为此节点已经不健康,从而达到对不是自己负责的节点健康状态检查。


第二类OPENAPI方式

在这里插入图片描述

OpenAPI 注册的临时实例也是通过同步自身负责的节点到其他节点来更新其他节点的对应的临时实例的心跳时间,保证其他节点不会删除或者修改此实例的健康状态。

前面我们特别指明了是临时实例而没有说所有实例,你应该也可能会想到这种方式对于持久化节点会显得多余,永久实例会在被主动删除前⼀直存在于注册中心,那么我们健康检查并不会去删除实例,所以我们只需要在负责的节点永久实例健康状态变更的时候通知到其余的节点即可

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习之线性回归模型

1 线性回归模型介绍 线性回归模型是机器学习中非常基础且经典的模型,是利用线性拟合的方式探寻数据背后的规律,特征变量的个数可将线性回归模型分为一元线性回归和多元线性回归。 (1)一元线性回归 线性模型的原型为一元一次方程&…

多线程/WinAPI线程退出方式比较分析

文章目录 概述ExitThreadTerminateThread进程退出逼迫线程退出?线程入口函数返回验证无法执行C对象析构不同方案的比较参考或关联 概述 关于如何终止 Windows 线程,在 MSDN Terminating a Thread 一文中列举的很详细: A thread executes until one of …

python数据赋值后,修改新数据,原数据如何保证不被修改?

目录 1.deepcopy 2.实战演练 3.python中的变量实质 好文推荐:传送锚点 1.deepcopy python中对象,赋值后是同一地址,如果是可变对象,对其中一个修改会影响到另一个,如果要生成完全新的对象,应使用&#…

使用Gogs搭建自己的github服务器

文章目录 下载Gogs配置和启动让gogs保持运行 使用参考资料 Gogs官方网址:https://gogs.io/ 下载Gogs 在官网首页可以找到二进制运行,点击进去 让咱们去 github 咱们就去 github 看看好了。https://github.com/gogs/gogs/releases 找到自己需要的版本。 …

【OpenMMLab AI实战营第二期】语义分割与MMSegmentation

MMSegmentation 开源代码仓:https://github.com/open-mmlab/mmsegmentation 算法丰富:600预训练模型、40篇算法复现 模块化设计:配置简便、容易拓展 统一超参:大量消融实验、支持公平对比 使用方便:训练工具、调试…

Python处理办公自动化的10大场景

在编程世界里,Python已经是名副其实的网红了。Python最大优势在于容易学,门槛比Java、C低非常多,给非程序员群体提供了用代码干活的可能性。当然Python能成为大众编程工具,不紧是因为易学,还因为Python有成千上万的工具…

2. CompletableFuture

2.1 Future接口理论知识复习 Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 举例:比如主线程让一个子线程去执行任…

python中的map函数

1. map()函数的简介以及语法: 1.1 map是python内置函数,会根据提供的函数对指定的序列做映射。 1.2 map()函数的格式是: map(function,iterable,...) 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列 1.3 map的返…

linux基本功之高效学习Linux命令行工具的技巧:Pandoc实战

前言 大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第65篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象&am…

F407之位带操作

位带操作的应用场景,通常在于对IO口进行输入输出读取和控制。 这就和51单片机中直接的端口赋值是一样的。 比如 P0.0 0; P0.0 1; 直接就是对端口P0.0输出0和1。 如何实现呢? 什么是位带操作 位带操作简单的说,就是把每个比特膨胀为一个32位…

全面了解AES加密:入门指南

文章目录 I. 介绍A. 什么是加密B. 为什么要加密1. 保护数据的机密性2. 防止数据被篡改3. 防止数据被窃取4. 保护数据的可信度 C. AES加密的概述 II. 对称加密与非对称加密A. 对称加密的定义和特点1. 简单快速2. 安全性较低3. 适合大量数据加密4. 密钥管理困难5. 用途广泛 B. 非…

黑马版Redis基础篇

一、 初识redis 1.1 认识 NoSQL 关系型数据库: 1.2 认识Redis 二、Redis 常见命令 2.1 Redis 数据结构介绍 2.2 Redis 通用命令 2.3 String 类型 2.3.1 Key的层级格式 2.4 Hash 类型 2.5 List 类型 2.6 Set 类型 2.7 SortedSet 类型 三、Redis 的 Java 客户端 1.…

DelayQueue的核心属性和写入、读取流程分析

DelayQueue的核心属性 DelayQueue的写入流程分析 add方法也是包装使用offer方法。Delay是无解的,数组又可以动态扩容,不需要关注生产者的阻塞问题 offer方法分析 DelayQueue读取流程 消费者消费元素存在两种阻塞的情况: 1.消费者得到栈顶的…

华为OD机试真题 JavaScript 实现【预定酒店】【2022Q4 100分】

一、题目描述 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的 数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店 (n>k>0) ,并由低到高打印酒店的价格。 二、输入描述 第一行: n,…

chatgpt赋能python:Python怎么开三次方?

Python怎么开三次方? Python是一门常用的高级编程语言,被广泛用于数据分析、人工智能、Web开发等领域。在Python中,我们可以使用几种方法轻松地计算三次方根,例如使用sqrt函数、cbrt函数和简单的数学表达式。本文将介绍三种方法&…

聊聊Scrum三大角色的质量意识和文化建设

这是鼎叔的第六十三篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。 参考前文:聊聊Scrum价值观与测试启发 本篇从Scrum的主要角色视角…

开关电源精确到每个元件-分解电源电路

本次讲解电源以一个13.2W电源为例 输入:AC90~264V 输出:3.3V/4A 原理图: 变压器是整个电源供应器的重要核心,所以变压器的计算及验证是很重要的。 1.决定变压器的材质及尺寸: 依据变压器计算公式 2.决定一次侧滤波电容&#…

第五章JMM内存模型

文章目录 计算机硬件存储体系为什么要弄一个 CPU 高速缓存呢?为什么缓存能提高速度呢?缓存带来的问题 Java之JMM模型JMM 是如何抽象线程和主内存之间的关系线程之间如何通信Java 内存区域和 JMM 有何区别 JMM规范下,三大特性原子性可见性有序…

000mysql常用资源推荐

官网 MySQL :: MySQL 8.0 Reference Manualhttps://dev.mysql.com/doc/refman/8.0/en/ 博客 一树一溪 侧重原理https://mp.weixin.qq.com/mp/homepage?__bizMzg3NTc3NjM4Nw&hid2&snb5d65ce17893a722b6748b471412eab0&scene1&devicetypeandroid-33&ver…

Spring-Boot的创建与配置文件

文章目录 前言Spring与SpringBoot的区别SpringBoot的创建与使用 更改国内源配置SpringBoot目录介绍SpringBoot配置文件配置⽂件的格式properties 基本语法yml的基本语法yml的注意事项 properties VS yml 好坏 前言 前面讲述了 ,Spring的概念与使用方法 , 接下来要介绍的是 Spr…