假设我们有3台机器,并配上相应的权重:IPA:5, IPB:1,IPC:1。
public class ServerIps {
public static final Map<String, Integer> MAP_LIST = new HashMap<>();
static {
MAP_LIST.put("IPA",5);
MAP_LIST.put("IPB",1);
MAP_LIST.put("IPC",1);
}
}
定义权重类
public class Weight {
//固定权重
private Integer weight;
//当前权重
private Integer curWeight;
private String ip;
public Weight(Integer weight, Integer curWeight, String ip) {
this.weight = weight;
this.curWeight = curWeight;
this.ip = ip;
}
//省略get与set
}
平滑加权轮询
public class RoundRobin {
private static Map<String, Weight> weightMap = new HashMap<>();
public static String getServer(){
int totalWeight = ServerIps.MAP_LIST.values().stream().reduce(0,(w1,w2) -> w1 + w2);
if(weightMap.isEmpty()){
for (String ip: ServerIps.MAP_LIST.keySet()) {
Integer weight = ServerIps.MAP_LIST.get(ip);
weightMap.put(ip,new Weight(weight,weight,ip));
}
}
Weight maxCurWeight = null;
for(Weight weight : weightMap.values()){
if(maxCurWeight == null || weight.getCurWeight() > maxCurWeight.getCurWeight()){
maxCurWeight = weight;
}
}
maxCurWeight.setCurWeight(maxCurWeight.getCurWeight() - totalWeight);
for(Weight weight : weightMap.values()){
weight.setCurWeight(weight.getCurWeight() + weight.getWeight());
}
return maxCurWeight.getIp();
}
//测试
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)