
一、负载均衡基础认知
1. 核心定义
负载均衡(Load Balance):将客户端请求均匀分配到服务器集群,解决高并发访问问题,提升系统吞吐量与可用性。
2. 分类
- 软件负载均衡:Nginx、LVS、HAProxy
- 硬件负载均衡:F5、Array
3. 核心前提
所有算法基于服务器列表 ,通过规则筛选目标节点,支持权重配置适配不同服务器性能。
二、Dubbo 五大负载均衡算法详解
Dubbo 内置 5 种负载均衡策略,覆盖随机、轮询、哈希、实时负载场景,均支持加权优化分配效果。
1. 随机算法(RandomLoadBalance)
- 基础原理:生成随机数匹配服务器下标,请求量越大分配越均匀。
- 加权优化:按权重划分区间,随机数落在对应区间则选中节点,避免内存浪费。
- 适用场景:服务器性能相近、无状态服务。
2. 轮询算法(RoundRobinLoadBalance)
- 基础轮询:按服务器列表顺序依次分配,公平但不考虑性能差异。
- 加权轮询:按调用编号取余总权重,匹配权重区间选中节点。
- 缺陷:权重高的节点会连续处理请求,流量分布不均。
3. 平滑加权轮询(WeightRoundRobinV2)
- 核心设计 :每个节点维护固定权重 weight +动态权重 currentWeight。
- 执行流程 :
- 动态权重累加固定权重
- 选中动态权重最大节点
- 选中节点动态权重减去总权重
- 优势:流量平滑分散,避免集中请求,Dubbo 推荐加权轮询方案。
4. 一致性哈希(ConsistentHashLoadBalance)
- 核心原理 :对请求参数/客户端 IP 哈希,映射到哈希环,固定请求命中固定节点。
- 虚拟节点:解决节点增减导致的流量倾斜问题,提升分配均匀性。
- 适用场景:有状态服务、缓存集群、需要会话保持的场景。
5. 最小活跃数(LeastActiveLoadBalance)
- 核心原理 :优先分配给活跃调用数最小的节点(活跃数=正在处理的请求数)。
- 加权逻辑:多个节点活跃数相同时,按权重随机选择。
- 优势:感知服务器实时处理能力,性能优的节点优先承接请求。
三、Dubbo 服务调用全流程
1. 服务消费端执行逻辑
- Mock 层:MockClusterInvoker 执行 Mock 逻辑
- 集群路由:AbstractClusterInvoker 添加附件、路由筛选 Invoker
- 负载均衡:FailoverClusterInvoker 按策略选中目标 Invoker
- 过滤器链:执行 ConsumerContextFilter、MonitorFilter 等过滤器
- 异步转同步:AsyncToSyncInvoker 阻塞等待结果
- 网络发送:DubboInvoker 通过 Netty 异步发送请求,DefaultFuture 等待响应
2. 服务提供端执行逻辑
- 网络接收:NettyServerHandler 接收数据,心跳过滤
- 线程池调度:AllChannelHandler 封装任务提交线程池
- 请求解码:DecodeHandler 解析请求路径、方法、参数
- 过滤器链:执行 EchoFilter、ContextFilter、TimeoutFilter 等
- 服务执行:AbstractProxyInvoker 调用实际业务方法
- 结果返回:封装响应,通过 Netty 回传消费端
3. 核心线程模型
- 消费端:同步调用阻塞等待,异步调用非阻塞,基于 Netty 异步通信
- 提供端:AllChannelHandler 统一接收请求,线程池异步处理,提升并发能力
四、Dubbo 异常处理机制
- 异常传递:服务端异常捕获后封装为 AppResponse,消费端 recreate 方法重新抛出
- ExceptionFilter 兜底规则 :
- 方法签名声明、JDK/Dubbo 自带异常、同包异常直接返回
- 未知异常包装为 RuntimeException 返回消费端
- 核心价值:保证异常可跨服务传递,避免消费端因缺少异常类导致报错。
五、核心总结
- 负载均衡 :五大算法覆盖不同场景,平滑加权轮询、最小活跃数为生产主流
- 调用流程:消费端路由 → 负载均衡 → 过滤 → 网络发送;提供端接收 → 解码 → 过滤 → 执行
- 设计亮点:加权适配异构集群、平滑轮询优化流量、最小活跃数感知实时负载、异常跨服务传递