首页 > 其他分享 >Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

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

时间:2023-09-09 18:31:35浏览次数:37  
标签:服务 中心 19 Nacos 实例 注册 健康检查 客户端

0 前言

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

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

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

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

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

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

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

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

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

Nacos 健康检查机制

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

2 Nacos服务的特点

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

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

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

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

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

3 临时实例健康检查机制

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

  • Nacos 的 OpenAPI
  • 或 Nacos 提供的 SDK

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

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

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

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

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

4 永久实例健康检查机制

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6 总结

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

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

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

标签:服务,中心,19,Nacos,实例,注册,健康检查,客户端
From: https://blog.51cto.com/JavaEdge/7420459

相关文章

  • 2019 ICPC Universidad Nacional de Colombia Programming Contest
    A.Amazon给定\(n\)条直线(存在共线的情况),在每两条垂直的直线的交点处需要建一个交叉点,求交叉点的数量,注意需要去除共线时候的交叉点题解因为要除去共线的情况,我们考虑将一条直线以方向向量\(v\),与\(x\)轴的交点的横坐标\(x\)的方式存储注意:对于\(v\)来说需要最简形......
  • SQL Server2019服务端启停
    服务器端是数据库,客户端是访问数据库的驱动。 背景:有时候只需要连接远程数据库操作即可,本地服务端可以暂不开启,减少内存的开销。 启动:1、任务管理器-服务-SQLServer(MSSQLSERVER)启动 开始后: 2、计算机管理-服务-SQLServer(MSSQLSERVER)启动 3、打开【开始】......
  • Nacos 配置中心:微服务架构的利器
    1.本次文章主要介绍如何使用Nacos作为项目的配置中心。研发环境如下:SpringCloud、SpringBoot和spring-cloud-alibaba本版如下spring-cloud:2021.0.6spring-cloud-alibaba:2021.0.5.0springBoot:2.7.142.为什么需要配置中心在微服务架构中,系统被拆分成多个小型、独立的服务,每个服......
  • luogu P1419 题解
    题目链接description给定一个长度为\(n\)的序列(值域为\([-10^4,10^4]\))和正整数\(st,ed\)。求一个区间,使得其长度\(\in[st,ed]\)且平均值最大,输出平均值。\(1\leqn\leq10^5\)solution这里给出一个复杂度线性的做法。求出前缀和数组\(s\),答案相当于\(\max\limit......
  • DBeaver执行sql脚本报错:CreateProcess error=193, %1 不是有效的 Win32 应用程序。
    DBeaver执行sql脚本报错:CreateProcesserror=193,%1不是有效的Win32应用程序。如图:  定位发现DBeaver默认安装的mysql.exe大小为0字节!解决方案,重新给DBeaver指定有效的mysql安装的bin目录下mysql.exe即可:选中当前的mysql连接,右键:编辑连接-主要-本地客户端-浏览......
  • [RoarCTF 2019]Easy Java
    [RoarCTF2019]EasyJava打开题目发现如下界面根据题目的提示,这道题不太可能考sql注入,应该是与java有关,因此点击help查看信息这里提示java.io.FileNotFoundException:{help.docx},而url路径中的参数正是filename=help.docx这里需要了解一个知识点:WEB-INFWEB-INF是java的WEB......
  • arm架构docker安装nacos
    前言搞了个hk1box,装了armbian系统,想用这个当服务器调试微服务,需要安装nacos。尝试安装非docker版本的nacos,去github下载arm版本的并且放到linux下面,运行的时候报tomcat错误,装了tomcat后还是报错,改了很多设置老是跑不了,于是决定用docker版本。1、挂载目录mkdir-p/home/nacos/l......
  • 暑假集训Day19 比赛题解
    2023-08-0516:22:13总结这次打下来,由于T2贪心不够完全,T3模拟\(5\)个时不是最优,T4想到暴力做法但是来不及打,加之全都是捆绑测试点,导致我T2,T3虽然加起来有不少点对了,但是还是判全错,最后也只剩下T1的100。感觉这次前三题也不难,都是可做的,T4的30pts暴力也很白给,但......
  • 19 线程不安全的例子
    packageThreadDemo;importjava.util.ArrayList;importjava.util.List;//线程可能不安全/*1.买火车票2.银行取钱3.线程不安全的数组列表*/publicclassTest18_UnsafeList{publicstaticvoidmain(String[]args){List<String>list=new......
  • Oracle OCP 19c认证考试1Z0-082题库最新解析 第四题
    4.YoucurrentlyhaveanactivetransactioninyoursessionandhavebeengrantedselectaccesstoV$TRANSACTIONInwhichthreesituationswillre-executingthisquerystillreturnarowbutwithadifferentXIDindicatinganewtransactionhasstarted?A.af......