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 上下线做发布摘流;保护阈值是健康比例不足时的兜底策略,防止调用方把剩余健康实例压垮。掌握了这些,就能精细控制流量在实例间的分配。

笔记加载中…