java中用数组实现加权轮询的核心是将服务器权重转化为可重复索引序列,通过二维数组存储服务器地址与整数权重,再按权重展开为索引数组并顺序轮询。

Java 中用数组实现加权轮询(Weighted Round Robin),核心是把服务器权重转成“可重复出现的索引序列”,再按顺序取值。不依赖额外框架,纯数组+状态变量就能完成。
准备带权重的服务器数组
用一个二维数组或两个平行一维数组存服务器地址和对应权重。推荐二维数组,结构清晰:
String[][] servers = {
{"192.168.1.10", "2"},
{"192.168.1.11", "3"},
{"192.168.1.12", "1"}
};
注意:权重建议转为整数,避免浮点误差;若原始是小数(如 1.5、2.5),统一乘以 10 或 100 取整再用。
构建展开后的索引映射数组
加权轮询本质是让高权重节点在调度序列中出现更频繁。最简方式是“展开”——把每个服务器按权重数量复制进一个索引数组:
- 权重为 2 → 在数组中占 2 个位置
- 权重为 3 → 占 3 个位置
- 权重为 1 → 占 1 个位置
代码示例:
List<integer> wheel = new ArrayList(); for (int i = 0; i </integer>
用原子计数器实现线程安全的轮询
多个线程并发取服务节点时,需保证 nextIndex 自增不冲突。用 AtomicInteger 最稳妥:
private final AtomicInteger nextIndex = new AtomicInteger(0);
private final List<integer> wheel;
public String getNextServer() {
int idx = nextIndex.getAndIncrement() % wheel.size();
return servers[wheel.get(idx)][0];
}
</integer>
每次调用返回下一个加权选中的服务器 IP。取模确保循环,getAndIncrement 保证原子性,无锁高效。
可选优化:避免重复构建 wheel 数组
服务器列表一般静态或低频变更。wheel 数组应在初始化时构建一次,而非每次请求重建。若需动态更新权重,可加 volatile 引用 + 重新生成逻辑,但日常场景直接初始化即可。
不复杂但容易忽略:权重为 0 的节点要跳过,否则 wheel 中插入空位会破坏比例;上线新节点时,重建 wheel 并替换引用(配合 volatile 或 AtomicReference)即可平滑生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











