操作场景
本地缓存: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