9.5.2 服务治理策略:权重、路由与熔断

服务治理策略决定了流量如何在实例间分配、如何处理异常与降级,是保障可用性与稳定性的关键。Nacos在服务发现基础上支持权重、路由与熔断等治理能力,运维侧需结合业务特性与容量规划制定策略并持续校验效果。

文章图片

权重策略:影响实例被选中概率(灰度/容量差异)
示例:使用 Nacos OpenAPI 调整实例权重与验证效果

# 1) 查询当前实例列表
curl -s "http://nacos:8848/nacos/v1/ns/instance/list?serviceName=order-svc" | jq .

# 2) 为新实例设置低权重(灰度)
curl -X PUT "http://nacos:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.10.10.21" \
  -d "port=8080" \
  -d "weight=0.2" \
  -d "enabled=true" \
  -d "healthy=true"

# 3) 逐步提升权重
curl -X PUT "http://nacos:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.10.10.21" \
  -d "port=8080" \
  -d "weight=1.0"

预期效果:负载均衡器按权重分流,新实例低权重时接收少量流量,稳定后提升占比。

路由策略:按元数据进行版本/地域/租户隔离
示例:为实例打标签并通过客户端或网关实现路由(元数据驱动)

# 为实例设置元数据
curl -X PUT "http://nacos:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-svc" \
  -d "ip=10.10.10.22" \
  -d "port=8080" \
  -d "metadata[region]=sh" \
  -d "metadata[version]=v2"

# 查询带元数据的实例
curl -s "http://nacos:8848/nacos/v1/ns/instance/list?serviceName=order-svc" | jq '.hosts[].metadata'

客户端侧路由(示例:Spring Cloud LoadBalancer 伪配置)

# application.yml
spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
# 通过自定义策略使用 metadata 过滤实例

预期效果:只将 v2 或 region=sh 的实例作为候选,支持灰度与就近访问。

熔断策略:快速失败避免级联故障
Nacos 本身不直接提供熔断器,但可与客户端/网关熔断协作。
示例:网关层(如 Spring Cloud Gateway)启用熔断(概念性配置)

spring:
  cloud:
    gateway:
      routes:
      - id: order-route
        uri: lb://order-svc
        predicates:
        - Path=/order/**
        filters:
        - name: CircuitBreaker
          args:
            name: orderCircuit
            fallbackUri: forward:/fallback/order

预期效果:错误率或超时达到阈值时触发熔断,进入降级路径。

命令解释与排错
- 查看实例健康与权重:

curl -s "http://nacos:8848/nacos/v1/ns/instance/list?serviceName=order-svc" | jq '.hosts[] | {ip,port,weight,healthy,enabled,metadata}'
  • 常见问题与定位:
    1) 权重不生效:检查实例是否被重复注册(多个 namespace/group)
    bash # 指定 namespaceId 和 groupName 查询 curl -s "http://nacos:8848/nacos/v1/ns/instance/list?serviceName=order-svc&groupName=DEFAULT_GROUP&namespaceId=public"
    2) 路由失效:确认 metadata 是否一致、客户端缓存是否刷新
    bash # 查看 Nacos 日志 tail -n 100 /home/nacos/logs/nacos.log
    3) 熔断触发后不恢复:检查熔断半开配置与健康检查恢复
    bash # 确认实例健康状态为 true curl -s "http://nacos:8848/nacos/v1/ns/instance/list?serviceName=order-svc" | jq '.hosts[] | {ip,healthy}'

练习
1. 将 order-svc 中一个实例权重降为 0.1,观察请求分流变化。
2. 为 order-svc 添加 version=v2 元数据,配置路由仅命中 v2。
3. 模拟接口超时触发熔断(如设置超时 100ms),验证降级路径。
4. 故障演练:将实例 healthy 置为 false,观察客户端/网关行为。