【需求背景】

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 看一下是否能正常访问。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐