负载均衡算法(java)

来源:互联网 发布:网络设计方案图 编辑:程序博客网 时间:2024/04/30 15:58
package com.test.junit;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Random;import java.util.Set;/** * 模拟负载均衡算法 * @author cwm * */public class LoadBalance {        private static Integer pos = 0;        public static Map<String,Integer> getServerIps(){         Map<String,Integer> serverIps = new HashMap<String,Integer>();         //权重为1         serverIps.put("192.168.1.100", 1);         serverIps.put("192.168.1.101", 1);         //权重为4         serverIps.put("192.168.1.102", 4);         serverIps.put("192.168.1.103", 1);         serverIps.put("192.168.1.104", 1);         //权重为3         serverIps.put("192.168.1.105", 3);         serverIps.put("192.168.1.106", 1);         serverIps.put("192.168.1.107", 1);         //权重为2         serverIps.put("192.168.1.108", 2);         serverIps.put("192.168.1.109", 1);         serverIps.put("192.168.1.110", 1);         return serverIps;    }    /**     * 源地址法     * 思路:获取客户端Ip的hashCode值     * 将该hashCode值与服务器列表大小取模,得到目标服务器Ip的序号     * @param remoteIp     * @return     */    public static String consumerHash(String remoteIp){        String serverIp = null;        Map<String,Integer> serverIps = new HashMap<String,Integer>();        serverIps.putAll(getServerIps());                Set<String> keySet = serverIps.keySet();        List<String> keyList = new ArrayList<String>();        keyList.addAll(keySet);                int hashCode = remoteIp.hashCode();        int serverTableSize = keyList.size();        int pos = hashCode % serverTableSize;        serverIp = keyList.get(pos);        return serverIp;            }    /**     * 随机法     * @return     */    public static String random(){        String serverIp = null;        Map<String,Integer> serverIps = new HashMap<String,Integer>();        serverIps.putAll(getServerIps());                List<String> keyList = new ArrayList<String>();        Set<String> keySet = serverIps.keySet();        keyList.addAll(keySet);                Random random = new Random();        int index = random.nextInt(keyList.size());                serverIp = keyList.get(index);        return serverIp;    }        /**     * 权重随机法     * @return     */    public static String weightRandom(){        String serverIp = null;        Map<String,Integer> serverIps = new HashMap<String,Integer>();        serverIps.putAll(getServerIps());                Set<String> keySet = serverIps.keySet();        Iterator<String> it = keySet.iterator();                List<String> keyList = new ArrayList<String>();        while(it.hasNext()){            String key = it.next();            int weight = serverIps.get(key);            for(int i=0;i<weight;i++){                keyList.add(key);            }        }                Random random = new Random();        int index = random.nextInt(keyList.size());        serverIp = keyList.get(index);        return serverIp;    }    /**     * 轮询法     */    public static String roundRobin(){        String serverIp = null;        //重新创建一个Map,避免出现由于服务器上线和下线导致的并发问题        Map<String,Integer> serverIps = new HashMap<String,Integer>();        serverIps.putAll(getServerIps());                Set<String> keySet = serverIps.keySet();        List<String> keyList = new ArrayList<String>();        keyList.addAll(keySet);                synchronized (pos) {            if(pos >= keyList.size()){                pos = 0;            }            serverIp = keyList.get(pos);            pos ++;        }        return serverIp;            }        /**     * 加权轮询法     * @return     */    public static String weightRoundRobin(){        String serverIp = null;        //重新创建一个Map,避免出现由于服务器上线和下线导致的并发问题        Map<String,Integer> serverIps = new HashMap<String,Integer>();        serverIps.putAll(getServerIps());                Set<String> keySet = serverIps.keySet();        Iterator<String> it = keySet.iterator();                List<String> keyList = new ArrayList<String>();        while(it.hasNext()){            String key = it.next();            Integer weight = serverIps.get(key);                        for(int i=0;i<weight;i++){                keyList.add(key);            }        }                synchronized (pos) {            if(pos >= keyList.size()){                pos = 0;            }            serverIp = keyList.get(pos);            pos ++;        }        return serverIp;            }        public static void main(String[] args){        //测试权重随机法        System.out.println("***************测试权重随机法***************");        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println(LoadBalance.weightRandom());        System.out.println("***************测试权重随机法***************");                //测试权重轮询法        System.out.println("***************测试权重轮询法***************");        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println(LoadBalance.weightRoundRobin());        System.out.println("***************测试权重轮询法***************");        //测试源地址法        System.out.println("***************测试源地址法***************");        System.out.println(LoadBalance.consumerHash("192.168.0.1"));        System.out.println(LoadBalance.consumerHash("192.168.0.2"));        System.out.println(LoadBalance.consumerHash("192.168.0.3"));        System.out.println(LoadBalance.consumerHash("192.168.0.4"));        System.out.println(LoadBalance.consumerHash("192.168.0.5"));        System.out.println(LoadBalance.consumerHash("192.168.0.6"));        System.out.println(LoadBalance.consumerHash("192.168.0.7"));        System.out.println(LoadBalance.consumerHash("192.168.0.8"));        System.out.println(LoadBalance.consumerHash("192.168.0.9"));        System.out.println(LoadBalance.consumerHash("192.168.0.10"));        System.out.println("***************测试源地址法***************");                System.out.println("***************测试轮询法***************");        //测试轮询法        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println(LoadBalance.roundRobin());        System.out.println("***************测试轮询法***************");                //测试随机法        System.out.println("***************测试随机法***************");        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println(LoadBalance.random());        System.out.println("***************测试随机法***************");            }}

输出:


0 0
原创粉丝点击