Skip to content

本地负载均衡功能说明 ⚖️

概述

wueasy-gateway 现在支持本地负载均衡功能,可以在多个后端服务实例之间分发请求,提供高可用性和负载分散。

功能特性

  • 多种负载均衡策略:支持轮询(round_robin)、随机(random)、加权轮询(weighted_round_robin)
  • 健康检查:自动检测后端服务实例的健康状态,自动剔除不健康实例
  • 配置灵活:支持不同服务使用不同的负载均衡策略
  • 无缝集成:与现有的nacos服务发现功能兼容,优先使用本地负载均衡

配置说明

基本配置

config.yaml 文件的 gateway 部分添加 loadbalancer 配置:

yaml
gateway:
  loadbalancer:
    enabled: true                # 启用负载均衡
    connection-timeout: 5s       # 连接超时时间
    check-interval: 30s          # 健康检查间隔
    services:
      - id: web-feign           # 服务ID
        uris:
          - 127.0.0.1:8082      # 服务节点1
          - 127.0.0.1:8083      # 服务节点2
        strategy: round_robin   # 负载均衡策略
      - id: api-service         # 另一个服务
        uris:
          - 192.168.1.100:8080  # 服务节点1
          - 192.168.1.101:8080  # 服务节点2
        strategy: weighted_round_robin  # 加权轮询策略
        weights: [3, 2]         # 对应的权重

配置参数详解

全局配置

  • enabled: 是否启用负载均衡功能
  • connection-timeout: 健康检查连接超时时间(支持格式: "5s", "1000ms", "1m"等)
  • check-interval: 健康检查间隔时间(支持格式: "30s", "1m", "500ms"等),设置为空则禁用健康检查

时间格式说明

  • ns - 纳秒
  • usµs - 微秒
  • ms - 毫秒
  • s - 秒
  • m - 分钟
  • h - 小时

示例: "300ms", "1.5s", "2m45s", "1h30m"

  • services: 服务列表配置

服务配置

  • id: 服务唯一标识符,需要与路由配置中的服务名匹配
  • uris: 后端服务实例地址列表,格式为 host:port
  • strategy: 负载均衡策略,可选值:
    • round_robin: 轮询(默认)
    • random: 随机
    • weighted_round_robin: 加权轮询
  • weights: 权重配置(仅当策略为 weighted_round_robin 时使用)

路由配置

在路由配置中使用 lb:// 前缀来启用负载均衡:

yaml
gateway:
  routes:
    - id: demo
      uri: lb://web-feign        # 使用负载均衡,web-feign对应服务ID
      predicates:
        - Path=/demo/**
        - Method=GET,POST
      filters:
        - StripPrefix=1

负载均衡策略

1. 轮询 (round_robin)

按顺序轮流选择后端实例,每个实例被选中的概率相等。

yaml
strategy: round_robin

2. 随机 (random)

随机选择后端实例。

yaml
strategy: random

3. 加权轮询 (weighted_round_robin)

根据配置的权重比例选择后端实例,权重越高被选中的概率越大。

yaml
strategy: weighted_round_robin
weights: [3, 2, 1]  # 对应uris的权重,比例为3:2:1

健康检查

负载均衡器会定期对后端服务实例进行健康检查:

  • 检查方式: 向每个实例的地址和端口建立TCP连接
  • 判断标准: 能够成功建立TCP连接视为健康,连接失败视为不健康
  • 启动检查: 负载均衡器启动后会立即执行一次健康检查,无需等待第一个检查间隔
  • 失败处理: 不健康的实例会被自动从负载均衡池中移除
  • 恢复机制: 实例恢复健康后会自动重新加入负载均衡池
  • 优势: TCP检查比HTTP检查更快速、更通用,不依赖特定的健康检查端点

工作流程

  1. 请求到达: 网关接收到请求
  2. 路由匹配: 根据路由规则匹配到对应的服务
  3. 负载均衡: 如果URI以 lb:// 开头且启用了负载均衡:
    • 首先尝试从本地负载均衡器获取实例
    • 如果本地负载均衡器没有配置该服务,则回退到nacos服务发现
  4. 请求转发: 将请求转发到选中的后端实例

监控和日志

负载均衡器的运行状态会记录在日志中:

  • 服务实例选择过程
  • 健康检查结果
  • 负载均衡器启动和关闭状态

最佳实践

  1. 合理设置健康检查间隔: 过短会增加系统负载,过长会影响故障检测速度
  2. 权重配置: 根据后端实例的实际处理能力设置权重
  3. 监控日志: 定期检查负载均衡器的运行日志,及时发现问题
  4. 备用方案: 保持nacos服务发现作为备用方案

示例配置

完整的配置示例:

yaml
gateway:
  routes:
    - id: user-service
      uri: lb://user-api
      predicates:
        - Path=/api/user/**
      filters:
        - StripPrefix=2
    - id: order-service
      uri: lb://order-api
      predicates:
        - Path=/api/order/**
      filters:
        - StripPrefix=2
  
  loadbalancer:
    enabled: true
    connection-timeout: 5s
    check-interval: 30s
    services:
      - id: user-api
        uris:
          - 192.168.1.10:8080
          - 192.168.1.11:8080
          - 192.168.1.12:8080
        strategy: round_robin
      - id: order-api
        uris:
          - 192.168.1.20:8080
          - 192.168.1.21:8080
        strategy: weighted_round_robin
        weights: [3, 2]

注意事项

  1. 健康检查使用TCP连接方式,确保后端服务的端口可以正常访问
  2. 负载均衡器会在网关启动时自动启动,在网关关闭时自动停止
  3. 配置更改需要重启网关才能生效
  4. 本地负载均衡与nacos服务发现可以同时使用,本地负载均衡优先级更高
  5. TCP健康检查比HTTP检查更轻量级,对后端服务压力更小