首页 > 代码库 > 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
1 import java.math.BigInteger; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.Map.Entry; 7 8 /** 9 * 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 10 * @author huligong 11 * */ 12 public class WeightedRoundRobinScheduling { 13 14 private int currentIndex = -1;// 上一次选择的服务器 15 private int currentWeight = 0;// 当前调度的权值 16 private int maxWeight = 0; // 最大权重 17 private int gcdWeight = 0; //所有服务器权重的最大公约数 18 private int serverCount = 0; //服务器数量 19 private List<Server> serverList; //服务器集合 20 21 /** 22 * 返回最大公约数 23 * @param a 24 * @param b 25 * @return 26 */ 27 private static int gcd(int a, int b) { 28 BigInteger b1 = new BigInteger(String.valueOf(a)); 29 BigInteger b2 = new BigInteger(String.valueOf(b)); 30 BigInteger gcd = b1.gcd(b2); 31 return gcd.intValue(); 32 } 33 34 35 /** 36 * 返回所有服务器权重的最大公约数 37 * @param serverList 38 * @return 39 */ 40 private static int getGCDForServers(List<Server> serverList ) { 41 int w = 0; 42 for (int i = 0, len = serverList.size(); i < len - 1; i++) { 43 if (w == 0) { 44 w = gcd(serverList.get(i).weight, serverList.get(i + 1).weight); 45 } else { 46 w = gcd(w, serverList.get(i + 1).weight); 47 } 48 } 49 return w; 50 } 51 52 53 /** 54 * 返回所有服务器中的最大权重 55 * @param serverList 56 * @return 57 */ 58 public static int getMaxWeightForServers(List<Server> serverList) { 59 int w = 0; 60 for (int i = 0, len = serverList.size(); i < len - 1; i++) { 61 if (w == 0) { 62 w = Math.max(serverList.get(i).weight, serverList.get(i + 1).weight); 63 } else { 64 w = Math.max(w, serverList.get(i + 1).weight); 65 } 66 } 67 return w; 68 } 69 70 /** 71 * 算法流程: 72 * 假设有一组服务器 S = {S0, S1, …, Sn-1} 73 * 有相应的权重,变量currentIndex表示上次选择的服务器 74 * 权值currentWeight初始化为0,currentIndex初始化为-1 ,当第一次的时候返回 权值取最大的那个服务器, 75 * 通过权重的不断递减 寻找 适合的服务器返回,直到轮询结束,权值返回为0 76 */ 77 public Server GetServer() { 78 while (true) { 79 currentIndex = (currentIndex + 1) % serverCount; 80 if (currentIndex == 0) { 81 currentWeight = currentWeight - gcdWeight; 82 if (currentWeight <= 0) { 83 currentWeight = maxWeight; 84 if (currentWeight == 0) 85 return null; 86 } 87 } 88 if (serverList.get(currentIndex).weight >= currentWeight) { 89 return serverList.get(currentIndex); 90 } 91 } 92 } 93 94 95 class Server { 96 public String ip; 97 public int weight; 98 public Server(String ip, int weight) { 99 super();100 this.ip = ip;101 this.weight = weight;102 }103 public String getIp() {104 return ip;105 }106 public void setIp(String ip) {107 this.ip = ip;108 }109 public int getWeight() {110 return weight;111 }112 public void setWeight(int weight) {113 this.weight = weight;114 }115 }116 117 118 public void init() {119 Server s1 = new Server("192.168.0.100", 3);//3120 Server s2 = new Server("192.168.0.101", 2);//2121 Server s3 = new Server("192.168.0.102", 6);//6122 Server s4 = new Server("192.168.0.103", 4);//4123 Server s5 = new Server("192.168.0.104", 1);//1124 serverList = new ArrayList<Server>();125 serverList.add(s1);126 serverList.add(s2);127 serverList.add(s3);128 serverList.add(s4);129 serverList.add(s5);130 131 currentIndex = -1;132 currentWeight = 0;133 serverCount = serverList.size();134 maxWeight = getMaxWeightForServers(serverList);135 gcdWeight = getGCDForServers(serverList);136 }137 138 139 public static void main(String[] args) {140 WeightedRoundRobinScheduling obj = new WeightedRoundRobinScheduling();141 obj.init();142 143 Map<String,Integer> countResult = new HashMap<String,Integer>();144 145 for (int i = 0; i < 100; i++) {146 Server s = obj.GetServer();147 String log = "ip:"+s.ip+";weight:"+s.weight;148 if(countResult.containsKey(log)){149 countResult.put(log,countResult.get(log)+1);150 }else{151 countResult.put(log,1);152 }153 System.out.println(log);154 }155 156 for(Entry<String, Integer> map : countResult.entrySet()){157 System.out.println("服务器 "+map.getKey()+" 请求次数: "+map.getValue());158 }159 }160 161 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。