Nacos 临时实例与持久化实例配置区别及适用场景是什么?

文章导读
大部分微服务业务场景默认使用临时实例即可,只有数据库、缓存等基础设施才需要考虑持久化实例。
📋 目录
  1. 配置与命令速用
  2. 核心原理差异
  3. 验证与排查
  4. 常见坑与注意事项
  5. 参考文档
A A

大部分微服务业务场景默认使用临时实例即可,只有数据库、缓存等基础设施才需要考虑持久化实例。

先说结论:临时实例适合动态变化的业务服务,持久化实例适合需要长期保留状态的基础设施服务。

  • 适合:临时实例用于 K8s Pod、弹性伸缩的微服务;持久化实例用于 MySQL、Redis 等静态服务。
  • 重点看:临时实例依赖客户端心跳,持久化实例依赖服务端主动探活。
  • 别忽略:Nacos 2.x 版本同一服务下的实例类型必须统一,不可混用。

配置与命令速用

在 Spring Cloud Alibaba 项目中,通过配置文件控制实例类型,默认即为临时实例。非 Spring 环境需通过 SDK 或 Open API 显式指定。

1. Spring Cloud Alibaba 配置

# 临时实例(默认,可省略)
spring.cloud.nacos.discovery.ephemeral=true

# 持久化实例(需显式配置)
spring.cloud.nacos.discovery.ephemeral=false

2. 原生 Java SDK 配置

使用 Native SDK 注册时,需通过 Instance 对象设置 ephemeral 属性。

Instance instance = new Instance();
instance.setIp("192.168.1.10");
instance.setPort(8080);
instance.setWeight(1.0);
instance.setHealthy(true);
instance.setEnabled(true);
// 关键配置:false 表示持久化实例
instance.setEphemeral(false); 

namingService.registerInstance("service-name", instance);

3. Open API 手动注销(持久化实例必备)

持久化实例不会自动删除,服务下线时需调用 API 显式注销,避免产生僵尸实例。

Nacos 临时实例与持久化实例配置区别及适用场景是什么?
curl -X DELETE 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=service-name&ip=192.168.1.10&port=8080&ephemeral=false'

核心原理差异

两者的核心区别在于生命周期管理方式和数据存储机制。临时实例设计初衷是为了适应云原生环境,实例信息仅存储在内存中,客户端通过心跳包(默认间隔 5 秒)维持活性。若服务端 15 秒未收到心跳标记为不健康,30 秒未收到则直接从内存删除,这保证了注册列表的实时性。

持久化实例则将信息写入磁盘,即使服务下线也不会自动删除,只会标记为不健康。其健康检查由服务端主动发起(默认每 20 秒检测一次),适合那些不能轻易从注册列表消失的关键基础设施。此外,临时实例通常采用 Distro 协议保证可用性,而持久化实例采用 Raft 协议保证一致性。

验证与排查

1. 控制台观察:登录 Nacos 控制台,查看服务列表。临时实例停止服务后,约 30 秒会自动消失;持久化实例停止后,会保留但显示不健康状态。

2. 接口验证:调用 Nacos 开放 API 查询实例详情,检查 ephemeral 字段是否符合预期配置。

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=service-name&ip=192.168.1.10&port=8080'

3. 注销验证:对于持久化实例,执行下线操作后,再次查询接口确认实例是否已移除。若未移除,检查 API 调用参数中的 ephemeral 是否与服务注册时一致。

Nacos 临时实例与持久化实例配置区别及适用场景是什么?

常见坑与注意事项

1. 混合注册:在 Nacos 2.x 中,同一服务不可混用临时和持久化实例,否则可能导致部分实例注册失败或状态异常。

2. 网络抖动:临时实例对网络敏感,若客户端心跳因网络波动超时,可能被误删,需确保网络稳定性或调整心跳阈值。

3. 僵尸实例:持久化实例若未正确注销,会长期残留不健康记录,影响服务列表整洁度。务必在服务下线钩子中调用注销 API 或 SDK 方法。

4. 协议与端口:Nacos 2.x 默认使用 gRPC 协议通信,若防火墙未开放相应端口(主端口 +1000 和 +1001,如 8848 对应 9848 和 9849),可能导致心跳上报失败,实例被误判下线。

参考文档