注册配置治理 Nacos 客户端本地缓存及推空保护开启

这篇说说Nacos客户端本地缓存和推空保护两种容灾机制,前者在服务端短暂失联时从缓存读取服务列表,后者防止服务端异常推送空列表导致业务中断,并给出配置步骤。 本地缓存:默认开启且不可关闭,启动时从文件缓存读,运行中从内存缓存读。 推空保护:客户端拦截空推送,需开启namingPushEmptyProtection=true开关。

相关产品
注册配置治理 产品页,含版本规格、价格与购买入口。

一、操作场景

·本地缓存:Nacos Server 因网络抖动、主动升级或意外宕机导致短暂失联(例如秒级到分钟级不可用)。客户端需在服务端不可用期间继续工作,避免因服务发现中断导致业务调用失败。

·推空保护:运维人员误操作(例如删除服务)、Nacos Server 异常(例如数据损坏)或恶意攻击导致服务端推送空服务列表。客户端需避免信任异常推送,防止服务列表被清空。

二、缓存机制

Nacos 客户端有两种缓存机制,两种缓存机制默认开启,并且不支持关闭。

·内存缓存。

·文件缓存:默认保存在 {user.home}/nacos/naming/{namespace}/failover 。

三、生效逻辑

客户端本地缓存生效逻辑:

·启动时,先从服务端查询数据,如果服务端没有响应,从文件缓存读取数据。

·运行中,先从内存缓存查询数据,如果内存缓存没有,从服务端查询数据,并且更新内存缓存和文件缓存。

·缓存更新机制:运行中会有异常任务监听服务端变更,更新内存缓存和文件缓存。

四、保证启动时文件缓存有效的操作方法

不同的应用部署方式,如何保证启动时文件缓存有效?

·CVM 部署:不要清理缓存文件

·容器部署:POD 挂载 volume,并挂载目录 {user.home}/nacos,可确保 POD 重启后,容灾文件依旧存在。

五、推空保护

Nacos 的推空保护是一种客户端容错机制,旨在防止服务端因异常情况(例如误操作、数据损坏)向客户端推送空服务列表,导致客户端误删本地缓存并引发服务调用中断。其核心原理是通过客户端逻辑拦截异常推送,结合本地缓存实现服务列表的“故障隔离”。

六、本地缓存默认生效

客户端本地缓存默认开启,并且不支持关闭。

七、本地缓存不生效场景

·场景1:Spring Boot 开启健康检查接口,k8s 存活探针配置 Spring Boot 健康检查接口。可能导致 k8s Pod 重启,缓存失效。

·场景2:通过 Nacos OpenAPI 访问 Nacos 服务端,例如:APISIX 服务发现插件使用 Lua 脚本调用 Nacos OpenAPI。

场景1实践教程

·在 Spring Boot 2.3.x 之前,Actuator 提供 /actuator/health 接口。

·/actuator/health 接口:反映 Spring Boot 依赖组件的实时监控状态。

·Spring Boot 没有建议在 k8s readiness 和 liveness 探针中配置 /actuator/health 接口。

·从 Spring Boot 2.3.x 版本开始,Actuator 针对 k8s 场景新增两个接口。

·/actuator/health/readiness 接口:用于配置 readiness 探针。

·/actuator/health/liveness 接口:用于配置 liveness 探针。

·其他说明:

·spring cloud alibaba 开源项目相关 issue :https://github.com/alibaba/spring-cloud-alibaba/issues/3535

·spring cloud alibaba 开源项目成员相关建议:

场景2实践教程

调用 OpenAPI 访问 Nacos 服务端时,未使用 Nacos client SDK,且缺少本地缓存机制。建议如下:

·在查询数据后立即使用,可参考 Nacos client sdk 实现本地缓存,先更新内存缓存,再更新文件缓存。

·将数据写入其他组件,如果从服务端查询数据失败或者数据为空,不要对其他组件的数据进行更新。

八、推空保护

建议你开启 Nacos 客户端的推空保护开关(Nacos Java Client 1.4.1及以上版本支持客户端推空保护功能)。

1. 使用 Nacos-client

Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, "${Nacos 客户端负载均衡 IP}:8848");properties.put(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true");NamingService naming = NamingFactory.createNamingService(properties);

2. 使用 spring-cloud-alibaba

spring.cloud.nacos.discovery.namingPushEmptyProtection=true

3. 使用 Dubbo

dubbo.registry.address=nacos://${Nacos 客户端负载均衡 IP}:8848?namingPushEmptyProtection=true

赞 (0)
上一篇 5天前
下一篇 5天前