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);
    }

 

posted @ 2016-11-10 13:23  小严  阅读(629)  评论(0)    收藏  举报