Nacos 实例权重配置是客户端负载均衡的基础能力,适用于按比例放量的简单灰度场景,但无法基于 Header 或参数进行精细路由。
先说结论:权重配置是客户端负载均衡的基础能力,适合做全量发布前的小流量验证,但不具备路由识别能力。
- 适合:新旧版本按比例共存,不需要区分用户特征的灰度场景。
- 先准备:确认客户端负载均衡策略支持权重(如 Spring Cloud LoadBalancer),并确保实例健康状态正常。
- 验收:通过日志或监控统计实际请求落点,确认流量比例与权重设置一致。
控制台与 OpenAPI 操作
Nacos 支持通过控制台界面或 OpenAPI 修改实例权重,以下是具体操作方式:
控制台操作:
- 登录 Nacos 控制台,进入“服务管理”-“服务列表”。
- 点击目标服务旁的“实例”,找到新版本实例。
- 编辑实例权重,初始建议设为 1-10(总权重按比例计算)。
- 客户端刷新服务列表(通常有缓存,需等待或触发刷新)。
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 及负载均衡器,以下为核心配置:
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