如何在 Nacos 中配置服务权重实现灰度发布流量控制?

文章导读
Nacos 实例权重配置是客户端负载均衡的基础能力,适用于按比例放量的简单灰度场景,但无法基于 Header 或参数进行精细路由。
📋 目录
  1. 控制台与 OpenAPI 操作
  2. 客户端配置示例
  3. 流量验证脚本
  4. 原理与风险
  5. 常见坑
  6. 参考来源
A A

Nacos 实例权重配置是客户端负载均衡的基础能力,适用于按比例放量的简单灰度场景,但无法基于 Header 或参数进行精细路由。

先说结论:权重配置是客户端负载均衡的基础能力,适合做全量发布前的小流量验证,但不具备路由识别能力。

  • 适合:新旧版本按比例共存,不需要区分用户特征的灰度场景。
  • 先准备:确认客户端负载均衡策略支持权重(如 Spring Cloud LoadBalancer),并确保实例健康状态正常。
  • 验收:通过日志或监控统计实际请求落点,确认流量比例与权重设置一致。

控制台与 OpenAPI 操作

Nacos 支持通过控制台界面或 OpenAPI 修改实例权重,以下是具体操作方式:

控制台操作:

  1. 登录 Nacos 控制台,进入“服务管理”-“服务列表”。
  2. 点击目标服务旁的“实例”,找到新版本实例。
  3. 编辑实例权重,初始建议设为 1-10(总权重按比例计算)。
  4. 客户端刷新服务列表(通常有缓存,需等待或触发刷新)。

OpenAPI 调用:

可通过 HTTP 请求直接修改,适合集成到发布脚本中:

curl -X PUT 'http://<nacos-ip>:8848/nacos/v1/ns/instance?serviceName=YOUR_SERVICE&groupName=DEFAULT_GROUP&ip=192.168.1.10&port=8080&weight=10' \
-H 'Content-Type: application/x-www-form-urlencoded'

注意:需替换 IP、端口及服务名,权重值为整数。

客户端配置示例

确保 Spring Cloud Alibaba 项目正确配置了 Nacos Discovery 及负载均衡器,以下为核心配置:

如何在 Nacos 中配置服务权重实现灰度发布流量控制?
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        # 服务列表本地缓存刷新间隔,单位毫秒,默认 10000ms
        naming-load-cache-poll-interval: 5000 
    loadbalancer:
      nacos:
        enabled: true # 启用 Nacos 负载均衡策略

修改权重后,客户端通常会在秒级内感知变更,若未生效可检查缓存刷新间隔配置。

流量验证脚本

编写简单的 Shell 脚本连续发送请求,统计不同实例的响应情况,验证权重比例:

#!/bin/bash
TARGET_URL="http://gateway/service/api/info"
COUNT=100

for ((i=1; i<=$COUNT; i++)); do
  RESP=$(curl -s -w "%{http_code}" -o /dev/null $TARGET_URL)
  echo "Request $i: Status $RESP"
done
echo "Please check server logs for instance distribution"

更精确的验证需结合服务端日志,统计不同版本实例接收到的请求数量比例。

原理与风险

Nacos 服务端存储了每个服务实例的元数据,其中包含权重字段。当客户端发起调用时,负载均衡器会拉取实例列表,并根据权重算法计算概率。权重越高,被选中的概率越大。

关键风险:

  • 健康检查:务必保持健康检查开启。如果实例被标记为不健康,权重再高也不会被调用,关闭健康检查可能导致请求转发到不可用实例,引发线上故障。
  • 算法差异:不同负载均衡策略(如加权轮询 vs 加权随机)对权重敏感度不同,建议通过压测验证具体分布。

常见坑

  • 客户端缓存:修改权重后流量未变,通常是客户端缓存未过期,需检查刷新间隔配置。
  • 长连接粘滞:HTTP Keep-Alive 或 RPC 长连接可能导致流量粘滞,短时间内比例不准。
  • 权重非绝对值:权重代表概率比例,并非严格的请求计数控制,小样本下可能存在偏差。

参考来源

1. Nacos 官方文档 - 服务管理

2. Spring Cloud Alibaba 参考文档 - Nacos Discovery