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

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

注册中心的健康检查机制


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


   大喊求救,告知位置与健康状况,让搜救队知晓


   搜救队使用专业设备探测到被埋者位置


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


   客户端主动上报,告知服务端自己健康状态。若一段时间无上报,判定服务不健康。


   服务端主动探测客户端,检查其是否可探测。


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


   客户端主动上报状态,无上报判定异常


   服务端主动探测客户端


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


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


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


84f7a811afb64012ad0fe13b5be6198f.png


• 比喻场景中,主动呼救并报告位置与状态,可减轻搜救队工作量,专注救出。

• 类比服务健康检查,所有服务需要注册中心主动探测,任务量太大,考虑服务主动上报检查。

• 但如果呼救无力,搜救队仍会全面探测救出。

• 类比为服务本身无法主动上报,注册中心主动检查有用。

• 总之,主动上报模式减轻注册中心负载,但服务端无法主动上报时,注册中心主动检查必要。

• 前者适用于大多数正常服务,后者为少数异常服务提供保障。两种方式结合,可实现服务健康有效监控。

• 比喻清晰表达两种方式的作用与适用场景。正常情况下主动上报为主,异常情况由主动检查补充。注意两种方式的配合使用,实现完备监控。


7ba3c963eb654d0093df3bf893388572.png



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

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



Nacos 健康检查机制


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


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


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


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


9b6c9f7e70dc4b1f948c227037669d16.png



临时实例健康检查机制


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


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


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


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


549cd1055bbc47eebf0d85e54f3c46e4.png


永久实例健康检查机制


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



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


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



7b5db2b4d47d4d0b852327a9bd71409d.png


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


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



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



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


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

第一类SDK方式


2f3eb42f62994fa5ad9b7f47e5837490.png


第二类OPENAPI方式


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


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


相关文章
|
26天前
|
存储 负载均衡 数据库
探索微服务架构中的服务发现机制
【7月更文挑战第24天】在微服务架构的复杂网络中,服务发现是确保通信流畅与系统弹性的关键组件。本文将深入探讨服务发现的工作原理、面临的挑战以及解决方案,同时比较不同服务发现工具的性能特点,旨在为开发者提供实现高效服务发现的实战指南。
|
26天前
|
敏捷开发 设计模式 负载均衡
深入理解微服务架构中的服务发现与注册机制
【7月更文挑战第24天】在微服务架构的海洋中,服务发现与注册机制如同灯塔指引着航行的船只。本文将探索这一机制的重要性、实现原理以及面临的挑战,带领读者领略微服务架构中的关键导航系统。
|
22天前
|
NoSQL Redis
Redis 主从复制架构配置及原理
Redis 主从复制架构配置及原理
32 5
|
4天前
|
存储 缓存 Java
Eureka原理与实践:深入探索微服务架构的核心组件
在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理,并通过实践案例展示其在实际项目中的应用,以期为开发者提供一个高端、深入的视角。
11 0
|
4天前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
18 0
|
4天前
|
消息中间件 缓存 Kafka
图解Kafka:架构设计、消息可靠、数据持久、高性能背后的底层原理
【8月更文挑战第15天】在构建高吞吐量和高可靠性的消息系统时,Apache Kafka 成为了众多开发者和企业的首选。其独特的架构设计、消息可靠传输机制、数据持久化策略以及高性能实现方式,使得 Kafka 能够在分布式系统中大放异彩。本文将通过图解的方式,深入解析 Kafka 的这些核心特性,帮助读者更好地理解和应用这一强大的消息中间件。
19 0
|
30天前
|
敏捷开发 设计模式 监控
探索微服务架构中的服务发现机制
【7月更文挑战第20天】在微服务架构的海洋中,服务发现是一艘必不可少的航船,它指引着各个服务如何相互寻觅和沟通。本文将深入探讨服务发现的核心原理、主流解决方案以及在实际应用中的考量因素,为构建高效、稳定的微服务系统提供导航。
26 2
|
29天前
|
存储 算法 缓存
高并发架构设计三大利器:缓存、限流和降级问题之滑动窗口算法的原理是什么
高并发架构设计三大利器:缓存、限流和降级问题之滑动窗口算法的原理是什么
|
29天前
|
算法 API 缓存
高并发架构设计三大利器:缓存、限流和降级问题之固定窗口限流算法的原理是什么
高并发架构设计三大利器:缓存、限流和降级问题之固定窗口限流算法的原理是什么
|
30天前
|
敏捷开发 存储 设计模式
探索微服务架构中的服务发现与注册机制
在微服务架构的复杂网络中,服务的发现与注册是确保高效通信的关键。本文将深入剖析服务发现与注册的核心原理、主流技术实现及其在现代后端系统中的应用,旨在为开发者提供一套实践指南,以应对动态变化的云环境挑战。 【7月更文挑战第20天】
17 0