如何在 Nacos 中实现弱依赖健康检查

背景

Nacos 作为一个微服务的注册中心和配置中心,其高可用性对整个微服务系统的稳定性至关重要。然而,目前很多微服务对 Nacos 的健康状态有着强依赖性,例如通过健康探测接口 /api/status/ready 来监控 Nacos Server 的健康状况。如果 Nacos Server 不健康,相关的微服务实例会被 K8s 下线,这会导致服务中断。

为了提升系统的高可用性,我们希望在 Nacos 不可用时,依然能够正常使用缓存的旧服务列表,保证服务的正常调用。本文将详细探讨如何通过配置启动参数,屏蔽 Spring Actuator 对 Nacos 的探测,从而实现这一目标。

技术探讨

配置参数

在微服务启动参数中添加以下配置:

-Dmanagement.health.nacos-discovery.enabled=false
-Dmanagement.health.nacos-config.enabled=false

这两个参数用于禁用 Spring Actuator 对 Nacos 服务发现和配置的健康检查。通过这些配置,即使 Nacos Server 不可用,微服务仍然会使用 Nacos Client 的缓存数据来继续提供服务。

工作原理

Nacos Client 内置了缓存机制,当 Nacos Server 不可用时,Nacos Client 会使用缓存的旧服务列表进行服务调用,从而保证服务的连续性。通过禁用健康检查,我们可以避免因为 Nacos Server 短暂不可用而导致微服务实例被 K8s 下线的情况。

测试方法

为了验证上述配置的有效性,我们可以进行以下测试步骤:

  1. 启动本地服务:启动你的本地微服务,并确保其正常运行。
  2. 修改 Nacos 地址:将本地微服务的 Nacos 地址修改为一个无法访问的地址,模拟 Nacos Server 不可用的情况。

报错信息如下:

 [com.alibaba.nacos.client.config.impl.ClientWorker] 398 ERROR [checkUpdateConfigStr] -->[check-update] get changed dataId exception java.net.ConnectException: [NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reachedat com.alibaba.nacos.client.config.http.ServerHttpAgent.httpPost(ServerHttpAgent.java:170) ~[nacos-client-1.2.1.jar:?]at com.alibaba.nacos.client.config.http.MetricsHttpAgent.httpPost(MetricsHttpAgent.java:64) ~[nacos-client-1.2.1.jar:?]at com.alibaba.nacos.client.config.impl.ClientWorker.checkUpdateConfigStr(ClientWorker.java:386) [nacos-client-1.2.1.jar:?]at com.alibaba.nacos.client.config.impl.ClientWorker.checkUpdateDataIds(ClientWorker.java:354) [nacos-client-1.2.1.jar:?]at com.alibaba.nacos.client.config.impl.ClientWorker$LongPollingRunnable.run(ClientWorker.java:521) [nacos-client-1.2.1.jar:?]at com.alibaba.ttl.TtlRunnable.run(TtlRunnable.java:59) [?:?]at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_241]at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [?:1.8.0_241]at java.util.concurrent.FutureTask.run(FutureTask.java) [?:1.8.0_241]at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_241]at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_241]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_241]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_241]at java.lang.Thread.run(Thread.java:748) [?:1.8.0_241]
  1. 本地调用测试:检查本地服务是否依然可以正常调用,不受 Nacos 不可用的影响。

    如果健康探测依然显示为 UP,不会引起 K8s 探测导致 Pod 下线,说明配置生效。

故障演练

为了进一步验证方案的有效性,可以在测试环境中进行故障演练。具体步骤如下:

  1. 部署测试环境:在测试环境中部署大部分服务。
  2. 下线 Nacos Server:选择一个没有发布任务的晚上,下线测试环境的 Nacos Server。
  3. 观察服务状态:观察服务是否能正常访问,验证服务是否依然使用缓存的服务列表进行调用。

深入分析与优化

Nacos 缓存机制

Nacos Client 内置了缓存机制,在 Nacos Server 短暂不可用的情况下,Nacos Client 会使用本地缓存的服务列表和配置信息。这种机制保证了服务在短时间内不会受到 Nacos Server 不可用的影响。

Spring Actuator 与 Nacos 健康检查

Spring Actuator 提供了一套健康检查机制,用于监控各种依赖的健康状态。通过禁用 Nacos 的健康检查,我们可以避免因为 Nacos Server 短暂不可用而导致微服务实例被 K8s 下线的情况,从而提高系统的可用性。

主从复制与一致性

在使用 Nacos 的 AP 模式时,需要注意数据的一致性问题。AP 模式允许数据短暂不一致,以保证高可用性。通过合理配置和监控,可以在一定程度上缓解数据不一致带来的影响。

硬件与资源配置

确保服务器的硬件资源(如 CPU、内存、I/O 等)充足,以应对高并发和大数据量的请求。同时,合理配置数据库和缓存,提高系统的整体性能和稳定性。

监控与优化

使用监控工具(如 Prometheus、Grafana 等)监控服务的运行状态和性能指标,及时发现并解决潜在问题。同时,根据监控结果进行参数调整和优化,进一步提高系统的稳定性和可用性。

总结

通过禁用 Spring Actuator 对 Nacos 的健康检查,可以在 Nacos Server 短暂不可用时,依然使用缓存的旧服务列表,保证服务的连续性。这种配置可以有效减少因 Nacos Server 不可用导致的服务中断,提高系统的高可用性。同时,通过合理的监控和优化,可以进一步提升系统的性能和稳定性。通过以上步骤,您可以实现对 Nacos 的弱依赖,提高整个微服务系统的健壮性和可靠性。

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

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

相关文章

无法启动此程序,因为计算机丢失api-ms-win-core-path-l1-1-0.dll的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Microsoft Visual C++ 2010 Express 使用

Microsoft Visual C 2010 Express 使用 Microsoft Visual C 2010 Express(简称VC 2010 Express)是一款免费的集成开发环境(IDE),专为C和C语言的开发者设计。 安装 下载|本站链接【VC2010简体中文版】的安装包并解压…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】:通过委托类型的参数,传入主调方法的被调用方法,主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话,如果通过,导演会…

mysql oracle postgreSQL区别

MySQL、Oracle Database和PostgreSQL是三种流行的关系型数据库管理系统(RDBMS),它们各有特点,适用于不同的应用场景。以下是它们之间的一些主要区别: 1.许可证和成本: 1.MySQL是一个开源数据库,…

一个集Swagger2 和 OpenAPI3为一体的增强接口文档工具,一把为您的API文档需求量身定制的“利刃”(附源码)

前言 在微服务和分布式系统架构日益普及的今天,API文档的管理与维护成为了开发过程中的一个关键环节。开发者们常常面临着API文档更新不及时、格式不统一、难以维护和阅读的问题。此外,随着API数量的增加,管理和维护这些文档变得越来越复杂。…

unity2022 il2cpp 源码编译

新建一个XCODE静态库工程 从unity安装目录中找到il2cpp源码 Editor\Data\il2cpp\ 改名 il2cpp/libil2cpp -> il2cpp/il2cpp 加入工程中 ->工程根目录 extends/zlib libil2cpp/ buildSettings 相关设置 IOS Deployment Target ios 12.0 Header Search Paths $(in…

Anthropic的Claude安卓版能否赢得用户青睐?

Anthropic的Claude安卓版能否赢得用户青睐? 前言 Anthropic 就在7月18日,这家以"可控AI"著称的初创公司再次出手,推出了Claude的Android版本应用。这款APP不仅支持实时语言翻译,更传承了Anthropic一贯的隐私保护政策。C…

FPGA 中的 IOE与IO BANK

IO bank(输入/输出bank) 定义:IO bank 是 FPGA 中一组 IOE 的集合,通常共享相同的电源电压、时钟域和时序管理。每个 IO bank 包含多个 IOE,它们可以根据需要分配给不同的信号处理任务。作用:IO bank 的存…

C++游戏时间——Maker_Game游戏头文件组1.0

我们都知道,C++可以写控制台、图形界面、静态库程序。 这几天,我写游戏都写炸毛了,但对于对静态库一窍不通的我,只能写图形库和控制台。 于是。。。。 Maker_Game游戏头文件组1.0诞生了! #include <Maker_Game/Ege.h> #include <Maker_Game/Console.h> Co…

配置文件格式 INI 快速上手

文章目录 1.简介2.语法节键值对注释大小写空白行数据类型字符串 (String)整数 (Integer)浮点数 (Float)布尔值 (Boolean)列表 (List) 3.示例4.解析参考文献 1.简介 INI 的全称是 Initialization&#xff0c;即为初始化文件&#xff0c;最早是 Windows 系统配置文件所采用的格式…

基于SpringBoot+Vue的校园志愿者管理系统(带1w+文档)

基于SpringBootVue的校园志愿者管理系统(带1w文档) 基于SpringBootVue的校园志愿者管理系统(带1w文档) 本次设计任务是要设计一个校园志愿者管理系统&#xff0c;通过这个系统能够满足管理员和志愿者的校园志愿者信息管理功能。系统的主要功能包括首页、个人中心、志愿者管理、…

pytorch学习(十六)conda和pytorch的安装

1.安装anaconda 1.1 首先下载安装包 1&#xff09;进入anaconda官网 Anaconda | The Operating System for AI 2&#xff09;注册一下 3&#xff09;下载 4&#xff09;一直点直到安装完 5&#xff09;配置环境变量 在path路径中加入 Anaconda安装路径 Anaconda安装路径\S…

量化交易对短期收益的提升效果

量化交易对短期收益的提升效果在当前金融市场中备受关注。随着科技的进步和市场环境的变化&#xff0c;量化交易利用先进的算法和模型&#xff0c;通过对大量数据的分析和处理&#xff0c;显著提升了短期投资的回报率。这种交易方式在全球经济不确定性增加的背景下&#xff0c;…

LeetCode 123题: 买卖股票的最佳时机 III代码优化(原创)

之前完成了LeetCode 123题&#xff1a; 买卖股票的最佳时机 III&#xff08;原创&#xff09;-CSDN博客&#xff0c;虽然完成代码编写&#xff0c;并提交成功&#xff0c;但运行效率不是很高。执行时长高达62ms&#xff0c;见下图&#xff1a; 看了下代码感觉可以通过将三维数组…

提交(git-add git-commit git-push)

当修改好一个功能的时候&#xff0c;可以提交到远程仓库&#xff0c;这样就等于更新了一次版本&#xff0c;那么下次改修了文件的话&#xff0c;是跟这个版本做对比的 git status&#xff0c; 查看文件修改情况&#xff0c;git add 假如你只想提交1个文件&#xff0c;那么直接…

IOC、DI<5> Unity、AOP、延迟获取对象、检索容器中注册信息

Unity.InterceptionExtension.ICallHandler实现一个操作日志记录功能 其它跟上一次一样 <?xml version"1.0" encoding"utf-8" ?> <configuration><configSections><section name"unity" type"Microsoft.Practice…

新手入门python该如何开始学习?学习路线是什么呢?

今天这篇文章从三个点给大家介绍一下新手学习Python的正确路线是什么、python最核心的知识点是什么 Python学习路线 Python学习路线可以大致分为以下几个阶段&#xff0c;每个阶段都包含了一系列核心知识点和技能&#xff1a; 第一阶段&#xff1a;Python基础 Python语言基础…

扫描某个网段下存活的IP:fping

前言&#xff1a; 之前用arp统计过某网段下的ip&#xff0c;但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况&#xff0c;可以使用fping fping命令类似于ping&#xff0c;但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…

递归与迭代

1. 概念区别 递归&#xff08;recursion&#xff09;&#xff1a;递归常被用来描述以自相似方法重复事物的过程&#xff0c;在数学和计算机科学中&#xff0c;指的是在函数定义中使用函数自身的方法。&#xff08;A调用A&#xff09; 迭代&#xff08;iteration&#xff09;&…

nodejs学习之Rollup

官网 https://github.com/rollup/rollup 英文文档 中文文档 是什么 Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xf…