负载均衡
基本概念与原理
负载均衡(Load Balancing)是一种将工作负载或网络流量分配到多个计算资源的技术。其核心目标是通过合理分配请求,优化资源使用,最大化吞吐量,最小化响应时间,同时避免单个资源过载。
负载均衡策略类型
1. 随机策略(Random)
- 默认策略
- 实现原理:从可用的服务提供者中随机选择一个
- 特点:简单高效,但无法考虑各节点实际负载情况
- 适用场景:各提供者性能相近,调用压力不大的场景
2. 轮询策略(Round Robin)
- 实现原理:按固定的顺序依次调用每个服务提供者
- 特点:公平分配请求,但无法考虑响应时间差异
- 适用场景:各提供者性能相近,且处理能力相当
3. 最少活跃调用数策略(Least Active)
- 实现原理:优先选择当前正在处理的请求数最少的提供者
- 特点:动态感知提供者负载情况,更智能
- 适用场景:各提供者处理能力差异较大的情况
4. 一致性Hash策略(Consistent Hash)
- 实现原理:相同参数的请求总是发到同一提供者
- 特点:可以利用本地缓存,避免频繁切换提供者
- 适用场景:需要保持会话状态的场景
配置方法示例
<!-- 服务提供方配置 -->
<dubbo:service interface="..." loadbalance="roundrobin"/>
<!-- 服务消费方配置 -->
<dubbo:reference interface="..." loadbalance="leastactive"/>
自定义均衡器
- 实现自定义负载均衡器
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);
}
}
- SPI 配置
文件路径:META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance
wzk=com.example.loadbalance.WzkLoadBalance
- 使用自定义负载均衡器
@Reference(loadbalance = "wzk")
private DemoService demoService;
高级配置与优化
- 权重配置:可以为不同服务提供者设置权重
<dubbo:provider weight="100"/>
<dubbo:provider weight="200"/>
- 动态调整:一些高级负载均衡器支持动态调整策略
- 健康检查:结合健康检查机制,自动剔除不健康的节点
- 区域感知:优先选择同机房或同区域的提供者