Java RPC 负载均衡算法
1.轮询法
将请求轮流的分配到后端服务器上,均衡的对待后端的每一台服务器,而不关心服务器的实际连接数和当前的系统负载
public static Integer pos = 0; public static void test(){ //模拟数据 实际情况可能会因为服务的上线、下线、宕机等,而发生变化 这个时候就需要重建一个map Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); serverWeigthMap.put("192.168.1.100", 1); serverWeigthMap.put("192.168.1.101", 1); //权重为4 serverWeigthMap.put("192.168.1.102", 4); serverWeigthMap.put("192.168.1.103", 1); serverWeigthMap.put("192.168.1.104", 1); //权重为3 serverWeigthMap.put("192.168.1.105", 3); serverWeigthMap.put("192.168.1.106", 1); //权重为2 serverWeigthMap.put("192.168.1.107", 2); serverWeigthMap.put("192.168.1.108", 1); serverWeigthMap.put("192.168.1.109", 1); serverWeigthMap.put("192.168.1.110", 1); //取得Ip地址list Set<String> keySet = serverWeigthMap.keySet(); ArrayList<String> keyList = new ArrayList<String>(); keyList.addAll(keySet); String server = null; //当前轮询位置pos,为了保证服务器选择的顺序性,需要在操作是对齐加上synchronized锁,使得在同一时刻只有一个线程能够修改pos的值, //否则pos变量被并发修改是则无法保证服务器选择的顺序性 synchronized(pos){ if(pos >= keySet.size()){ pos = 0; } server = keyList.get(pos); pos++; } }
2.加权轮询法
public static Integer pos = 0; public static void test(){ //模拟数据 实际情况可能会因为服务的上线、下线、宕机等,而发生变化 这个时候就需要重建一个map Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); serverWeigthMap.put("192.168.1.100", 1); serverWeigthMap.put("192.168.1.101", 1); //权重为4 serverWeigthMap.put("192.168.1.102", 4); serverWeigthMap.put("192.168.1.103", 1); serverWeigthMap.put("192.168.1.104", 1); //权重为3 serverWeigthMap.put("192.168.1.105", 3); serverWeigthMap.put("192.168.1.106", 1); //权重为2 serverWeigthMap.put("192.168.1.107", 2); serverWeigthMap.put("192.168.1.108", 1); serverWeigthMap.put("192.168.1.109", 1); serverWeigthMap.put("192.168.1.110", 1); //取得Ip地址list Set<String> keySet = serverWeigthMap.keySet(); Iterator<String> it = keySet.iterator(); List<String> serverList = new ArrayList<String>(); while(it.hasNext()){ String server = it.next(); Integer weight = serverWeigthMap.get(server); for (int i = 0; i < weight; i++) { serverList.add(server); } } String server = null; //当前轮询位置pos,为了保证服务器选择的顺序性,需要在操作是对齐加上synchronized锁,使得在同一时刻只有一个线程能够修改pos的值, //否则pos变量被并发修改是则无法保证服务器选择的顺序性 synchronized(pos){ if(pos >= keySet.size()){ pos = 0; } server = serverList.get(pos); pos++; } System.out.println(server); }
Java JavaScript ECMAScript 小严

浙公网安备 33010602011771号