Nacos 负载均衡核心能力总结
一、核心前提:开启 Nacos 负载均衡
要让下面所有功能生效,必须在调用方(如 order-service)的配置文件中开启 Nacos 负载均衡:
yaml
spring:
cloud:
loadbalancer:
nacos:
enabled: true
不加这个配置,默认的 Spring Cloud 轮询策略会让「权重」「同集群优先」都失效。
二、核心能力 1:服务上线下线(故障自动剔除)
1. 功能说明
- 当服务实例正常关闭或意外宕机时,Nacos 会自动将其从服务列表中剔除。
- 负载均衡器会立刻停止向下线的实例转发请求,只发给健康实例。
2. 你关心的问题
- 问题 :某个实例下线了,会不会影响其他实例?
- 回答:不会。只要还有其他健康实例,请求会自动转发到可用实例,不影响业务。
- 问题 :服务下线是立刻生效吗?
- 回答:主动关闭(优雅下线)是立刻生效;宕机 / 断网的实例,Nacos 会在健康检查失败后自动剔除(几秒内)。
三、核心能力 2:权重配置(流量分配控制)
1. 功能说明
- 每个服务实例都可以设置 0~100 的权重,数值越大,分到的请求越多。
- 权重为
0时,实例直接下线,不接收任何请求(可用于优雅停机、灰度发布)。
2. 你关心的问题
- 问题 :为什么权重配置了不生效?
- 回答 :因为没开启
spring.cloud.loadbalancer.nacos.enabled=true,默认轮询策略不认权重。
- 回答 :因为没开启
- 问题 :权重怎么用?
- 回答 :
- 灰度发布:新实例设高权重,旧实例逐步调低到 0,实现无痛切换。
- 故障止损:故障实例设为 0,立刻停止流量,不影响用户。
- 流量分担:高峰期通过调整权重,将部分流量导到其他集群实例。
- 回答 :
四、核心能力 3:同集群优先访问(就近访问)
1. 功能说明
- 服务可以通过
spring.cloud.nacos.discovery.cluster-name配置所属集群(如beijing)。 - 负载均衡策略会优先选择同集群内的实例,只有当同集群实例全部下线 / 不健康时,才会降级访问其他集群的实例。
2. 你关心的问题
- 问题 :同集群的机器处理不过来,会自动分流到其他集群吗?
- 回答 :不会。默认策略只有在同集群实例全挂 / 不健康时,才会跨集群访问。
- 想主动分流,必须通过手动调整权重实现(降低本集群权重,提高其他集群权重)。
- 问题 :同集群优先的优先级比权重高吗?
- 回答 :是的。执行顺序是:
- 优先筛选同集群实例
- 在同集群内按权重分配流量
- 同集群无可用实例时,才会跨集群访问
- 回答 :是的。执行顺序是:
五、三者协同的完整执行流程
当 order-service 调用 product-service 时,完整的负载均衡逻辑是:
- 筛选集群:优先选择和自己同集群的 product-service 实例。
- 过滤健康实例:剔除已下线、不健康的实例。
- 按权重分配:在可用实例中,根据权重比例分发请求。
- 跨集群兜底:如果同集群没有可用实例,才会降级访问其他集群的实例。
六、关键结论
- 「权重」和「同集群优先」生效的前提是开启 Nacos 负载均衡。
- 服务下线自动剔除,实现高可用。
- 权重可手动控制流量分配,支持灰度发布和故障止损。
- 同集群优先是就近访问,不会自动跨集群分担压力,仅用于故障兜底。
- 高峰期跨集群流量分担,必须通过手动调整权重实现。