一 算法

源地址 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 台服务器

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。