import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/* 模拟实现:负载均衡的轮询算法 */
public class RoundRobin {
public static void main(String[] args) {
Map<String, Integer> serverWeightMap = new HashMap<String, Integer>();
serverWeightMap.put("192.168.0.1", 1);
serverWeightMap.put("192.168.0.2", 2);
serverWeightMap.put("192.168.0.3", 1);
serverWeightMap.put("192.168.0.4", 4);
serverWeightMap.put("192.168.0.5", 3);
serverWeightMap.put("192.168.0.6", 1);
/* 重新创建一个Map,避免由于服务器上线和下线导致的并发问题 */
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(serverWeightMap);
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
/* 定义了轮询位置 */
Integer POS = 2;
String currentServer;
synchronized (POS) {
if (POS > keyList.size()) {
POS = 0;
}
currentServer = keyList.get(POS++);
}
System.out.println("current server is : " + currentServer);
}
}
上述代码模拟实现了负载均衡中的轮询算法,但是代码中有这么一段不是很懂。为什么另外还要搞一个map呢?而且就算这样,假如serverWeightMap中有服务器宕机,虽然采用了putAll的复制措施,但是这样可能导致的情况就是,轮询后的server可能是不可用的,因为服务器宕机更新的map,并不是现在的map结构。
/* 重新创建一个Map,避免由于服务器上线和下线导致的并发问题 */
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(serverWeightMap);
看上去没有检测服务器是否在线的代码,所以用两个map没啥用,而且那个wight的integer也没有用到,这个代码没写完吧。