负载均衡指Hash取模算法

2019-04-14 20:31发布

负载均衡的实现过程中有多种方式,随机,轮询,hash等,本处主要讲解基于java的hash算法,具体实现代码如下:
第一步创建以ip为健值得hashmap存放对象 public class IpMap
{
    // 待路由的Ip列表,Key代表Ip,Value代表该Ip的权重
    public static HashMap serverWeightMap = 
            new HashMap();
    
    static
    {
        serverWeightMap.put("192.168.1.100", 1);
        serverWeightMap.put("192.168.1.101", 1);
        // 权重为4
        serverWeightMap.put("192.168.1.102", 4);
        serverWeightMap.put("192.168.1.103", 1);
        serverWeightMap.put("192.168.1.104", 1);
        // 权重为3
        serverWeightMap.put("192.168.1.105", 3);
        serverWeightMap.put("192.168.1.106", 1);
        // 权重为2
        serverWeightMap.put("192.168.1.107", 2);
        serverWeightMap.put("192.168.1.108", 1);
        serverWeightMap.put("192.168.1.110", 1);
        serverWeightMap.put("192.168.1.109", 1);
    }
}

第二步采用hash的算法取模进行测试 public class Hash
{
    public static String getServer()
    {
        // 重建一个Map,避免服务器的上下线导致的并发问题
        Map serverMap = 
                new HashMap();
        serverMap.putAll(IpMap.serverWeightMap);
        
        // 取得Ip地址List
        Set keySet = serverMap.keySet();
        System.out.println(keySet);
        ArrayList keyList = new ArrayList();
        keyList.addAll(keySet);
        
        // 在Web应用中可通过HttpServlet的getRemoteIp方法获取
        String remoteIp = "127.0.0.1";
        String newIP = "192.168.1.109";
        int hashCode = remoteIp.hashCode();
        int hashCode1 = newIP.hashCode();
        System.out.println(hashCode+","+hashCode1);
        int serverListSize = keyList.size();
        int serverPos = hashCode % serverListSize;
        int serverPos1 = hashCode1 % serverListSize;
        System.out.println(serverPos+","+serverPos1);
        if(hashCode1 < 0){
        serverPos1 = Math.abs(serverPos1);
        }
        System.out.println(keyList.get(serverPos1));
        
        return keyList.get(serverPos);
    }
    
    public static void main(String args[]){
    getServer();
    System.out.println(getServer());
    }

这种方法比较简单,原因是在创建hashmap的对象时候,ip地址已经被经hash处理之后有序的排放在map集合里面,当外部服务ip过来访问的时候,会对这个ip地址进行一次hash,然后相对map集合的长度进行取模运算,这样得到的一个取模的值就可以对应map集合里取到的ip地址,这样就完成了负载均衡的实践