Commit 3461a7a4 by Nepxion

优化和修复随机权重的算法

parent b9da7639
package com.nepxion.discovery.plugin.framework.loadbalance;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.List;
import com.nepxion.discovery.common.entity.WeightFilterEntity;
import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter;
import com.netflix.loadbalancer.Server;
public interface IWeightRandomLoadBalance {
void setPluginAdapter(PluginAdapter pluginAdapter);
WeightFilterEntity getWeightFilterEntity();
Server choose(List<Server> serverList, WeightFilterEntity weightFilterEntity);
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.loadbalance.weight;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.commons.collections4.CollectionUtils;
import com.nepxion.discovery.common.entity.WeightFilterEntity;
import com.netflix.loadbalancer.Server;
public class ArrayWeightRandomLoadBalance extends AbstractWeightRandomLoadBalance {
@Override
public Server choose(List<Server> serverList, WeightFilterEntity weightFilterEntity) {
if (CollectionUtils.isEmpty(serverList)) {
return null;
}
int[] weights = new int[serverList.size()];
for (int i = 0; i < serverList.size(); i++) {
Server server = serverList.get(i);
int weight = getWeight(server, weightFilterEntity);
if (weight > 0) {
weights[i] = weight;
}
}
int index = getIndex(weights);
return serverList.get(index);
}
private int getIndex(int[] weights) {
// 次序号/权重区间值
int[][] weightHolder = new int[weights.length][2];
// 总权重
int totalWeight = 0;
// 赋值次序号和区间值累加的数组值,从小到大排列
// 例如,对于权重分别为20,40, 60的三个服务,将形成[0, 20),[20, 60),[60, 120]三个区间
for (int i = 0; i < weights.length; i++) {
if (weights[i] <= 0) {
continue;
}
totalWeight += weights[i];
weightHolder[i][0] = i;
weightHolder[i][1] = totalWeight;
}
// 获取介于0(含)和n(不含)伪随机,均匀分布的int值
int hitWeight = ThreadLocalRandom.current().nextInt(totalWeight) + 1; // [1, totalWeight)
for (int i = 0; i < weightHolder.length; i++) {
if (hitWeight <= weightHolder[i][1]) {
return weightHolder[i][0];
}
}
return weightHolder[0][0];
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment