9.5.3 实例生命周期管理与故障隔离

实例生命周期管理覆盖“注册—健康维护—变更—下线—隔离”的闭环。核心目标是注册信息一致、变更可追溯、下线平滑、故障快速隔离。以下给出原理草图、完整示例、排错与练习。

文章图片

1)实例上线:注册、预热与权重控制#

示例:临时实例注册(带权重/元数据)

# 注册临时实例到指定集群/命名空间
# 关键参数:serviceName、ip、port、weight、metadata
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.0.0.10" \
  -d "port=8080" \
  -d "weight=0.1" \
  -d "clusterName=cn-bj" \
  -d "namespaceId=public" \
  -d "metadata={\"version\":\"v1\",\"az\":\"bj-a\"}"

# 预期效果:实例已注册但低权重,避免冷启动瞬时承压

示例:逐步提升权重(预热完成)

# 将权重从0.1调整到1.0
curl -s -X PUT "http://127.0.0.1:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.0.0.10" \
  -d "port=8080" \
  -d "weight=1.0" \
  -d "clusterName=cn-bj"

排错要点
- 注册成功但不可发现:检查 namespaceIdclusterName 与客户端一致。
- 权重不生效:确认负载均衡策略支持权重(如 Ribbon/自研 LB)。

2)健康维护:心跳与超时阈值#

示例:临时实例心跳(默认5s)

# 心跳上报:beat 字段需包含serviceName与instance信息
curl -s -X PUT "http://127.0.0.1:8848/nacos/v1/ns/instance/beat" \
  -d "serviceName=order-svc" \
  -d "beat={\"ip\":\"10.0.0.10\",\"port\":8080,\"serviceName\":\"order-svc\",\"cluster\":\"cn-bj\"}"

示例:健康检查策略查看(服务维度)

# 查看服务详情,包含protectThreshold等
curl -s "http://127.0.0.1:8848/nacos/v1/ns/service?serviceName=order-svc"

排错要点
- 实例频繁不健康:检查心跳频率与 timeout/delete 阈值是否匹配。
- 大规模剔除风险:合理设置 protectThreshold,避免雪崩。

3)变更与扩缩容:路由、隔离与灰度#

示例:变更元数据(灰度标签)

# 为实例打灰度标签,配合路由规则使用
curl -s -X PUT "http://127.0.0.1:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.0.0.10" \
  -d "port=8080" \
  -d "metadata={\"version\":\"v2\",\"env\":\"gray\"}" \
  -d "clusterName=cn-bj"

建议流程
- 先扩容低权重实例 → 验证健康 → 放量 → 缩容旧版本。
- 变更记录:版本标签、变更窗口、回滚方案、配置版本。

4)下线与故障隔离:优雅下线与快速剔除#

示例:优雅下线(先降低权重再注销)

# 1. 降权重,停止接入新流量
curl -s -X PUT "http://127.0.0.1:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.0.0.10" \
  -d "port=8080" \
  -d "weight=0" \
  -d "clusterName=cn-bj"

# 2. 注销实例
curl -s -X DELETE "http://127.0.0.1:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.0.0.10" \
  -d "port=8080" \
  -d "clusterName=cn-bj"

故障隔离示例:快速拉黑异常实例(业务侧或路由侧)
- 在客户端路由规则中排除 metadata.env=black 或特定 ip
- 对同机房故障:切换 cluster 权重或暂停路由。

5)实例状态巡检与排错#

查看实例列表与健康状态

# 查看服务实例列表
curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=order-svc&clusterName=cn-bj"

# 输出关键字段:ip、port、healthy、weight、metadata

典型问题与定位
- 实例注册失败:检查 Nacos 权限、命名空间、端口冲突。
- 健康抖动:确认应用心跳线程、GC停顿、网络丢包。
- 下线不生效:确认客户端有缓存,触发订阅更新或清理本地缓存。

6)练习#

  1. 注册两个实例并将其权重设置为 0.2/1.0,观察路由倾斜效果。
  2. 模拟心跳停止,验证实例被标记不健康与剔除的时延。
  3. 执行优雅下线:先降权,再注销,记录影响时间窗口。