负载均衡

基本概念与原理

负载均衡(Load Balancing)是一种将工作负载或网络流量分配到多个计算资源的技术。其核心目标是通过合理分配请求,优化资源使用,最大化吞吐量,最小化响应时间,同时避免单个资源过载。

负载均衡策略类型

1. 随机策略(Random)

  • 默认策略
  • 实现原理:从可用的服务提供者中随机选择一个
  • 特点:简单高效,但无法考虑各节点实际负载情况
  • 适用场景:各提供者性能相近,调用压力不大的场景

2. 轮询策略(Round Robin)

  • 实现原理:按固定的顺序依次调用每个服务提供者
  • 特点:公平分配请求,但无法考虑响应时间差异
  • 适用场景:各提供者性能相近,且处理能力相当

3. 最少活跃调用数策略(Least Active)

  • 实现原理:优先选择当前正在处理的请求数最少的提供者
  • 特点:动态感知提供者负载情况,更智能
  • 适用场景:各提供者处理能力差异较大的情况

4. 一致性Hash策略(Consistent Hash)

  • 实现原理:相同参数的请求总是发到同一提供者
  • 特点:可以利用本地缓存,避免频繁切换提供者
  • 适用场景:需要保持会话状态的场景

配置方法示例

<!-- 服务提供方配置 -->
<dubbo:service interface="..." loadbalance="roundrobin"/>

<!-- 服务消费方配置 -->
<dubbo:reference interface="..." loadbalance="leastactive"/>

自定义均衡器

  1. 实现自定义负载均衡器
public class WzkLoadBalance implements LoadBalance {
    @Override
    public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url,
                                RpcException invocation) throws RpcException {
        // 实现自定义负载均衡逻辑
        int index = (int) (System.currentTimeMillis() % invokers.size());
        return invokers.get(index);
    }
}
  1. SPI 配置

文件路径:META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance

wzk=com.example.loadbalance.WzkLoadBalance
  1. 使用自定义负载均衡器
@Reference(loadbalance = "wzk")
private DemoService demoService;

高级配置与优化

  1. 权重配置:可以为不同服务提供者设置权重
<dubbo:provider weight="100"/>
<dubbo:provider weight="200"/>
  1. 动态调整:一些高级负载均衡器支持动态调整策略
  2. 健康检查:结合健康检查机制,自动剔除不健康的节点
  3. 区域感知:优先选择同机房或同区域的提供者