nacos 不进行健康检查
原因是健康探测接口:/api/status/ready 会去探测 nacos server 的健康状态,如果不健康,则把 pod 下线。作为一个服务注册中心,为了保证高可用应该使用 AP 模式(即数据可以短暂不一致,以保证其高可用),而 nacos 本身也支持 AP 模式。当 nacos server 不可用时,nacos client 自带的缓存保存的还是旧服务列表,依然可以保证服务正常调用。然
·
【需求背景】
nacos 作为一个中间件,微服务不应该强依赖于中间件。
作为一个服务注册中心,为了保证高可用应该使用 AP 模式(即数据可以短暂不一致,以保证其高可用),而 nacos 本身也支持 AP 模式。
但是我们现有的使用方式其实是强依赖于 nacos 的健康状况了。原因是健康探测接口:/api/status/ready 会去探测 nacos server 的健康状态,如果不健康,则把 pod 下线。
【技术探讨】
可以通过配置启动参数,屏蔽 spring actuator 的探测:
-Dmanagement.health.nacos-discovery.enabled=false
-Dmanagement.health.nacos-config.enabled=false
当 nacos server 不可用时,nacos client 自带的缓存保存的还是旧服务列表,依然可以保证服务正常调用。
【测试方法】
1)我把我本地的服务启动
2)然后修改本地的 nacos 地址,使得微服务无法连上 nacos server,报错信息如下:
2023-09-15 17:22:38.073 [TID: N/A] [meiji-proxy-mall,,,] [com.alibaba.nacos.client.Worker.longPolling.fixed-test-nacos.ifengqun.com_80-test] [com.alibaba.nacos.client.config.impl.ClientWorkerientWorker] 398 ERROR [checkUpdateConfigStr] -->[fixed-test-nacos.ifengqun.com_80-test] [check-update] get changed dataId exception java.net.ConnectException: [NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reached
at 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]
3)但是本地调用依然没有问题
然后,健康探测也是 UP 的,不会引起 k8s 探测,引起下线
【故障演练】
测试环境部署了大部分服务后,找个晚上没人发布的情况下,下线测试环境的 nacos server 看一下是否能正常访问。
更多推荐
已为社区贡献3条内容
所有评论(0)