Nacos 实例管理与负载均衡
一个服务通常有多个实例,注册中心不会替调用方真正转发流量,它通过实例的元数据、权重、健康状态等"喂养"客户端的负载均衡决策。本章讲实例管理相关概念与用法。
实例元数据 metadata
每个实例都可以挂一组键值对元数据,用来描述版本、机房、灰度标签等业务信息:
// 需放入 main 方法,并先 new NacosNamingService("localhost:8848")
Instance ins = new Instance();
ins.setIp("192.168.1.10");
ins.setPort(8080);
Map<String, String> meta = new HashMap<>();
meta.put("version", "v1.2.0");
meta.put("region", "shanghai");
ins.setMetadata(meta); // 元数据随实例一起注册
naming.registerInstance("order-service", ins);
元数据在控制台服务详情页可见,也可用于灰度路由、按地区选址等个性化逻辑。
权重 weight 与负载均衡
权重表示实例在服务中的"分流量占比",默认 1.0。权重越大被选中的概率越高,置为 0 表示不参与分配,常用于灰度小流量放量。修改权重用 PUT:
curl -X PUT 'http://localhost:8848/nacos/v1/ns/instance' \
-d 'serviceName=order-service&ip=192.168.1.10&port=8080&weight=0.5'
# 输出:ok # 该实例权重已改为 0.5,分到的流量约减半
消费端行为:Nacos 客户端默认按权重做随机选择;在 Spring Cloud 中对应 NacosLoadBalancer(见第 13 章),权重调整后无需重启调用方即可生效。
保护阈值 protectThreshold
保护阈值(0~1,默认 0)是防雪崩的兜底开关,在服务详情页设置。规则如下:
- 平时:发现列表只返回健康实例,不健康的被过滤掉
- 当健康实例数 ÷ 总实例数 ≤ 保护阈值时:改为返回全部实例(包括不健康)
示例:某服务 10 个实例,挂了 7 个,健康比例 0.3
保护阈值 = 0 → 调用方只拿到 3 个健康实例,3 个全被压垮 → 雪崩
保护阈值 = 0.5 → 0.3 ≤ 0.5,返回全部 10 个实例,由调用方自行重试容错
实例上下线 enabled 与 SLB
控制台实例行的"下线"把 enabled 置为 false,含义是"摘流量但保留注册":
- 场景一:发布新版本前把实例下线,等请求排空再重启,实现优雅发布
- 场景二:实例挂在外部负载均衡(SLB/Nginx)后面时,先摘除再操作,避免流量中断
发完版点"上线"(enabled=true)即恢复流量。注意它与注销的区别:下线不删实例,注销是彻底移除。
集群 cluster 与机房划分
同一服务下的实例还能按 clusterName 再分组(如 DEFAULT、sh、bj)。注册时指定 clusterName,查询时按集群过滤,可实现机房内就近调用、单元化部署:
curl -X GET 'http://localhost:8848/nacos/v1/ns/instance/list?serviceName=order-service&clusterName=sh'
与负载均衡组件集成
- Spring Cloud:引入 spring-cloud-starter-loadbalancer,注册中心为 Nacos 时默认按实例权重随机
- 老项目用 Netflix Ribbon:Nacos 也兼容,默认轮询,可按文档切换策略
小结
实例管理三板斧:metadata 描述实例、weight 控制流量比例、enabled 上下线做发布摘流;保护阈值是健康比例不足时的兜底策略,防止调用方把剩余健康实例压垮。掌握了这些,就能精细控制流量在实例间的分配。