在负载均衡的实现过程中有多种方式,随机,轮询,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地址,这样就完成了负载均衡的实践