负载均衡-加权轮询算法

负载均衡-加权轮询

由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在轮询算法的基础上给每台服务器设置权重,延伸为 加权轮询算法

1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重
2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP,权重越大,该服务器每轮所获得的请求数量越多。
3、循环计算 index ,获取对应的IP

package nginx;

import java.util.*;

public class RandomJava {
    /**
     * 服务器列表<服务器地址>
     */
    public static Map<String, Integer> map = new HashMap<String, Integer>() {
        {
            put("192.168.1.100", 3);
            put("192.168.1.102", 4);
            put("192.168.1.103", 5);
        }
    };
    static int index = 0;

    /**
     * 获取IP
     * @return
     */
    public static String getServer() {
        List<String> ipList = new ArrayList<String>();
        for (Map.Entry<String, Integer> item : map.entrySet()) {
            //将每个权重W 下的IP添加 W次,来满足权重
            for (int i = 0; i < item.getValue(); i++) {
                ipList.add(item.getKey());
            }
        }
        if (index == ipList.size()) {
            index = 0;
        }
        return ipList.get(index++);
    }

    public static void main(String[] args) {
        //三台服务器IP的调用概率
        double a = 0, b = 0, c = 0;
        int size = 100000000;
        String ip = "";
        for (int i = 0; i < size; i++) {
            ip = getServer();
            if (ip.equals("192.168.1.100")) {
                a++;
            }
            if (ip.equals("192.168.1.102")) {
                b++;
            }
            if (ip.equals("192.168.1.103")) {
                c++;
            }
            //System.out.println(ip);
        }
        System.out.println("  a:  " + a / size + "\n" + "  b:  " + b / size + "\n" + "  c:  " + c / size + "");
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_41367523/article/details/106476290