负载均衡之源地址Hash

一 算法

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


版权声明:本文为chengqiuming原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。