Nacos 客户端通过服务提供者配置注册权重元数据,配合消费者侧负载均衡规则实现流量按比例分发。适用 Spring Cloud Alibaba 微服务架构,风险在于负载均衡组件版本差异可能导致权重策略不生效。
先说结论:权重配置需同时在服务提供者注册信息和服务消费者负载均衡策略中生效,单一配置无法实现按比例分发。
- 适合:Spring Cloud Alibaba 微服务架构,需在同一服务集群内按实例性能分配流量。
- 先准备:确认 Nacos 服务端版本支持实例权重,确认消费者端负载均衡器支持权重规则。
- 验收:通过访问日志统计各实例请求量比例,验证是否符合设定权重比。
快速处理思路
配置权重主要涉及 YAML 配置文件修改和 Nacos 控制台设置,无需执行系统命令。
# 服务提供者 application.yml
spring:
cloud:
nacos:
discovery:
metadata:
weight: 10 # 设置实例权重,整数
# 服务消费者 application.yml (Ribbon 模式)
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
若使用 Spring Cloud LoadBalancer,通常无需额外配置规则类,但需确保 Spring Cloud Alibaba 版本较新。
为什么会这样
Nacos 服务端存储实例权重元数据,但流量分发由客户端负载均衡器决定。仅注册权重而不配置负载均衡规则,消费者仍可能使用轮询策略。
Nacos 服务发现机制将实例信息(含权重)拉取到本地缓存。Spring Cloud Alibaba 封装的负载均衡器需显式启用权重感知逻辑,否则默认忽略 metadata 中的 weight 字段。权重值越高,实例被选中的概率越大,权重为 0 表示实例不参与负载均衡。
分步处理
步骤 1:配置服务提供者权重
在提供者的配置文件 application.yml 或 bootstrap.yml 中设置 metadata 权重。
spring: cloud: nacos: discovery: metadata: weight: 5检查点:重启服务后,登录 Nacos 控制台,查看服务列表该实例的权重列是否显示为 5。
步骤 2:配置服务消费者负载均衡规则
若使用 Ribbon,需在消费者配置中指定 NacosRule。若使用 Spring Cloud LoadBalancer,检查版本说明是否默认支持。
ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule检查点:确认消费者依赖中包含 spring-cloud-starter-alibaba-nacos-discovery。
步骤 3:动态调整权重(可选)
登录 Nacos 控制台,找到对应服务实例,直接编辑权重数值。
风险边界:控制台修改的权重优先级通常高于配置文件,修改后无需重启服务,但需确保消费者缓存刷新。
怎么验证是否生效
通过日志统计或监控工具观察各实例的请求量分布。
方法 1:访问日志统计
在提供者接口中打印实例 IP 或主机名,连续发送请求,统计各实例接收请求的数量比例。
方法 2:监控面板
若接入 Prometheus 或 SkyWalking,查看服务调用的 QPS 分布,对比权重设置比例。
判断标准:长期请求趋势下,高权重实例的请求量应高于低权重实例,比例接近权重比。公开资料中没有看到可靠的量化数据说明短期请求必须严格匹配比例,负载均衡存在随机性。
常见坑
1. 负载均衡器版本不兼容
Spring Cloud 新版本移除了 Ribbon,若未迁移到 Spring Cloud LoadBalancer 或配置错误,权重规则无效。
2. 控制台权重覆盖配置
Nacos 控制台手动设置的权重会覆盖客户端配置文件中的 metadata 权重,排查时需注意配置来源。
3. 权重为 0 的含义
权重设置为 0 表示该实例不会被选中,常用于临时下线实例而不注销服务,但健康检查仍会进行。
常见问题
权重配置后流量没有变化怎么办?
检查消费者端是否配置了支持权重的负载均衡规则,并确认 Nacos 控制台实例列表权重已更新。
权重支持动态调整吗?
支持,通过 Nacos 控制台修改实例权重后,消费者端通常在秒级内感知变化,无需重启服务。
权重配置会影响健康检查吗?
不会影响,权重仅控制流量分发比例,实例健康状态由心跳检测决定,不健康实例会被自动剔除。
参考来源
- Nacos 官方文档,服务发现概念,https://nacos.io
- Spring Cloud Alibaba 官方文档,Nacos Discovery,https://github.com/alibaba/spring-cloud-alibaba