9.4.3 服务实例注册方式与心跳机制

本节聚焦 Nacos 的服务实例注册方式与心跳机制,说明实例如何注册、如何维持在线、如何影响服务发现与负载均衡。

原理草图(注册与心跳流程)

文章图片

服务实例注册方式
- 临时实例(ephemeral):依赖心跳续租;超时剔除;适合无状态与弹性伸缩。
- 持久实例(persistent):不因心跳超时自动剔除;需显式下线;适合关键业务。
- 主动注册 / 自动注册:通过 HTTP API 或 SDK 在启动时注册。

心跳机制关键点
- 客户端按周期上报心跳;服务端更新租约时间。
- 心跳超时触发不健康/剔除;影响服务发现结果。
- 自我保护阈值:短时间大量心跳丢失时,避免误剔除。


安装与环境准备(示例)#

以下为单机 Nacos(便于演示注册/心跳):

# 1) 启动 Nacos(Docker 示例)
docker run -d --name nacos \
  -e MODE=standalone \
  -p 8848:8848 \
  nacos/nacos-server:v2.3.0

# 2) 验证服务可用
curl -s "http://127.0.0.1:8848/nacos/v1/console/health/readiness"
# 预期输出: "ok"

方式一:HTTP API 主动注册(临时实例)#

# 注册一个临时实例(ephemeral=true)
curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=order-service&ip=10.0.0.11&port=8080&ephemeral=true&clusterName=DEFAULT"

# 查询实例列表
curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=order-service"

命令解释
- serviceName:服务名。
- ip/port:实例地址。
- ephemeral=true:临时实例,依赖心跳。
- clusterName:集群标识。

预期效果
- 实例出现在注册表中;若停止心跳,将在超时后剔除。


方式二:HTTP API 注册(持久实例)#

# 注册一个持久实例(ephemeral=false)
curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=payment-service&ip=10.0.0.12&port=8081&ephemeral=false"

# 持久实例即使无心跳也不会自动剔除
curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=payment-service"

心跳上报与超时(临时实例)#

# 1) 手动上报心跳
curl -X PUT "http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName=order-service&ip=10.0.0.11&port=8080"

# 2) 查看实例健康状态
curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=order-service"

心跳参数说明
- beat 接口用于更新租约时间。
- 未持续心跳会被标记不健康并剔除。


关键配置(心跳与保护阈值)#

# nacos/conf/application.properties
# 心跳间隔(客户端通常在 SDK 中配置)
nacos.naming.client.beatInterval=5000

# 心跳超时与剔除(服务端默认值可参考官方文档)
nacos.naming.client.ipDeleteTimeout=30000

# 自我保护阈值
nacos.naming.protection.threshold=0.85

排错与诊断#

# 1) 检查实例是否注册
curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=order-service" | jq .

# 2) 查看 Nacos 容器日志
docker logs -f nacos

# 3) 常见问题定位
# - 无法注册:检查 8848 端口、服务名、namespace/group
# - 心跳丢失:检查网络抖动、客户端重试、时间同步
# - 自我保护触发:关注心跳成功率与丢失比例

练习#

  1. 使用临时实例注册 order-service,停止心跳 1 分钟后观察是否被剔除。
  2. 注册持久实例 payment-service,关闭客户端后检查实例是否仍存在。
  3. 调整 beatIntervalipDeleteTimeout,观察故障收敛速度变化。