一 算法
源地址 Hash 是根据客户端的 IP 地址,通过 Hash 函数的运算把 IP 地址转换为一个固定的数字。根据“Hash”后的数字,对服务器列表进行取模运算,得到服务器的序号。
这种算法的好处是,同一个 IP 地址所选择的服务器总是相同的。相同服务器本地缓存数据,对于有状态的服务来说,每次访问都会命中缓存。
除了源地址 Hash 外,还有目标地址 Hash,它和源地址 Hash 的原理类似。
下图是按源地址进行 Hash 运算后,后端分配的请求情况。
二 实现
package loadbalance;
/**
* @className: HashIPSelect
* @description: 源地址 Hash
* @date: 2022/1/15
* @author: cakin
*/
public class HashIPSelect {
/**
* 功能描述:源地址 Hash 算法
*
* @param serverNum 后端服务器总量
* @param IP IP 地址
* @return int 服务器的序号,可以根据序号找到服务器 IP 地址并转发
* @author cakin
* @date 2022/1/15
*/
static int hashIPSelect(int serverNum, String IP) {
int hashCode = Math.abs(IP.hashCode());
return hashCode % serverNum;
}
public static void main(String[] args) {
int curServer = hashIPSelect(2, "172.10.0.1");
System.out.println("当前选择第 " + curServer + " 台服务器");
curServer = hashIPSelect(2, "172.10.0.2");
System.out.println("当前选择第 " + curServer + " 台服务器");
curServer = hashIPSelect(2, "172.10.0.3");
System.out.println("当前选择第 " + curServer + " 台服务器");
curServer = hashIPSelect(2, "172.10.0.4");
System.out.println("当前选择第 " + curServer + " 台服务器");
curServer = hashIPSelect(2, "172.10.0.5");
System.out.println("当前选择第 " + curServer + " 台服务器");
curServer = hashIPSelect(2, "172.10.0.6");
System.out.println("当前选择第 " + curServer + " 台服务器");
}
}
三 测试
当前选择第 0 台服务器
当前选择第 1 台服务器
当前选择第 0 台服务器
当前选择第 1 台服务器
当前选择第 0 台服务器
当前选择第 1 台服务器
好文阅读
发表评论