平滑加权轮询算法(Smooth Weight Round Robin)

代码

package cn.com.codingce.随做.平滑加权轮询算法;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 平滑加权轮询算法
 *
 * @author inke219223m
 */
public class SmoothWeightedRobinTest {

    /**
     * 实例列表
     */
    private List<ServerConfig> serverList = new ArrayList<>();
    /**
     * 最大权重
     */
    private Integer weightSum;


    public SmoothWeightedRobinTest(List<ServerConfig> serverList) {
        this.serverList = serverList;
        this.weightSum = serverList.stream().map(ServerConfig::getWeight).reduce((x, y) -> x += y).get();
    }

    public static void main(String[] args) {
        List<ServerConfig> list = new ArrayList<>();

        list.add(new ServerConfig("192.168.1.1", 5, 5));
        list.add(new ServerConfig("192.168.1.2", 1, 1));
        list.add(new ServerConfig("192.168.1.3", 1, 1));
        // 初始每个实例的当前有效权重为配置权重(初始化权重),并求得配置权重和weightSum;
        //int weightSum = list.stream().map(ServerConfig::getWeight).reduce((x, y) -> x += y).get();
        SmoothWeightedRobinTest test = new SmoothWeightedRobinTest(list);
        test.test();
    }

    // 临时存放每次选中后的当前权重
    List<ServerConfig> tempList = new ArrayList<>();
    // 所有选中的列表
    List<String> chooseList = new ArrayList<>();

    public void test() {
        System.out.println("初始化当前权重:" + serverList.toString());
        System.out.println();
        for (int i = 1; i <= 20; i++) {
            this.nextServerIndex(i);
        }
        System.out.println(chooseList);
    }

    public ServerConfig nextServerIndex(int index) {
        // 选出当前有效权重最大的实例,将当前有效权重currentWeight减去所有实例的"权重和"(weightSum),且变量tmpSv指向此位置;
        ServerConfig max = Collections.max(serverList, Comparator.comparingInt(ServerConfig::getCurrentWeight));
        // 选中的实例
        ServerConfig tmpSv = null;

        for (ServerConfig serverConfig : serverList) {
            if (max.equals(serverConfig)) {
                serverConfig.setCurrentWeight(serverConfig.getCurrentWeight() - weightSum);
                if (tmpSv == null || serverConfig.getCurrentWeight() > tmpSv.getCurrentWeight()) {
                    tmpSv = serverConfig;
                }
            }
            //为了打印
            try {
                tempList.add(serverConfig.clone());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            //将每个实例的当前有效权重currentWeight都加上配置权重weight;
            serverConfig.setCurrentWeight(serverConfig.getCurrentWeight() + serverConfig.getWeight());
        }
        //选中后的当前权重
        System.out.println("第" + index + "次选中后的当前权重:" + tempList.toString());
        tempList.clear();
        // 选中的实例
        System.out.println("第" + index + "次选中的实例:" + tmpSv.getName());
        // 全部选中的实例
        chooseList.add(tmpSv.getName());
        // 选中前的当前权重
        System.out.println("第" + (index + 1) + "次选中前的当前权重:" + serverList.toString());
        System.out.println();

        return tmpSv;
    }


    public static class ServerConfig {

        //服务名称
        public String name;

        //初始权重
        public int weight;

        //当前权重
        public int currentWeight;

        public ServerConfig() {
        }

        public ServerConfig(String name, int weight) {
            this.name = name;
            this.weight = weight;
        }

        public ServerConfig(String name, int weight, int currentWeight) {
            this.name = name;
            this.weight = weight;
            this.currentWeight = currentWeight;
        }

        public int getWeight() {
            return weight;
        }

        public void setWeight(int weight) {
            this.weight = weight;
        }

        public int getCurrentWeight() {
            return currentWeight;
        }

        public void setCurrentWeight(int currentWeight) {
            this.currentWeight = currentWeight;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "ServerConfig{" + "name='" + name + '\'' + ", curr=" + currentWeight + '}';
        }

        @Override
        public ServerConfig clone() throws CloneNotSupportedException {
//            // 使用Jackson序列化进行深拷贝
//            ObjectMapper objectMapper = new ObjectMapper();
//            User copyUser = objectMapper.readValue(objectMapper.writeValueAsString(user), User.class);

            ServerConfig serverConfig = new ServerConfig();
            serverConfig.setCurrentWeight(this.currentWeight);
            serverConfig.setName(this.name);
            serverConfig.setWeight(this.weight);
            return serverConfig;
        }
    }

}

日志

/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/bin/java -Dvisualvm.id=125005792986662 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=53787:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/rt.jar:/Users/mxz/mxz-code/gitee/codingce-leetcode/new_code/out/production/new_code cn.com.codingce.随做.平滑加权轮询算法.SmoothWeightedRobinTest
初始化当前权重:[ServerConfig{name='192.168.1.1', curr=5}, ServerConfig{name='192.168.1.2', curr=1}, ServerConfig{name='192.168.1.3', curr=1}]

第1次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-2}, ServerConfig{name='192.168.1.2', curr=1}, ServerConfig{name='192.168.1.3', curr=1}]
第1次选中的实例:192.168.1.1
第2次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=3}, ServerConfig{name='192.168.1.2', curr=2}, ServerConfig{name='192.168.1.3', curr=2}]

第2次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-4}, ServerConfig{name='192.168.1.2', curr=2}, ServerConfig{name='192.168.1.3', curr=2}]
第2次选中的实例:192.168.1.1
第3次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=1}, ServerConfig{name='192.168.1.2', curr=3}, ServerConfig{name='192.168.1.3', curr=3}]

第3次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=1}, ServerConfig{name='192.168.1.2', curr=-4}, ServerConfig{name='192.168.1.3', curr=3}]
第3次选中的实例:192.168.1.2
第4次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=6}, ServerConfig{name='192.168.1.2', curr=-3}, ServerConfig{name='192.168.1.3', curr=4}]

第4次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-1}, ServerConfig{name='192.168.1.2', curr=-3}, ServerConfig{name='192.168.1.3', curr=4}]
第4次选中的实例:192.168.1.1
第5次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=4}, ServerConfig{name='192.168.1.2', curr=-2}, ServerConfig{name='192.168.1.3', curr=5}]

第5次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=4}, ServerConfig{name='192.168.1.2', curr=-2}, ServerConfig{name='192.168.1.3', curr=-2}]
第5次选中的实例:192.168.1.3
第6次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=9}, ServerConfig{name='192.168.1.2', curr=-1}, ServerConfig{name='192.168.1.3', curr=-1}]

第6次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=2}, ServerConfig{name='192.168.1.2', curr=-1}, ServerConfig{name='192.168.1.3', curr=-1}]
第6次选中的实例:192.168.1.1
第7次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=7}, ServerConfig{name='192.168.1.2', curr=0}, ServerConfig{name='192.168.1.3', curr=0}]

第7次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=0}, ServerConfig{name='192.168.1.2', curr=0}, ServerConfig{name='192.168.1.3', curr=0}]
第7次选中的实例:192.168.1.1
第8次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=5}, ServerConfig{name='192.168.1.2', curr=1}, ServerConfig{name='192.168.1.3', curr=1}]

第8次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-2}, ServerConfig{name='192.168.1.2', curr=1}, ServerConfig{name='192.168.1.3', curr=1}]
第8次选中的实例:192.168.1.1
第9次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=3}, ServerConfig{name='192.168.1.2', curr=2}, ServerConfig{name='192.168.1.3', curr=2}]

第9次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-4}, ServerConfig{name='192.168.1.2', curr=2}, ServerConfig{name='192.168.1.3', curr=2}]
第9次选中的实例:192.168.1.1
第10次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=1}, ServerConfig{name='192.168.1.2', curr=3}, ServerConfig{name='192.168.1.3', curr=3}]

第10次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=1}, ServerConfig{name='192.168.1.2', curr=-4}, ServerConfig{name='192.168.1.3', curr=3}]
第10次选中的实例:192.168.1.2
第11次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=6}, ServerConfig{name='192.168.1.2', curr=-3}, ServerConfig{name='192.168.1.3', curr=4}]

第11次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-1}, ServerConfig{name='192.168.1.2', curr=-3}, ServerConfig{name='192.168.1.3', curr=4}]
第11次选中的实例:192.168.1.1
第12次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=4}, ServerConfig{name='192.168.1.2', curr=-2}, ServerConfig{name='192.168.1.3', curr=5}]

第12次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=4}, ServerConfig{name='192.168.1.2', curr=-2}, ServerConfig{name='192.168.1.3', curr=-2}]
第12次选中的实例:192.168.1.3
第13次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=9}, ServerConfig{name='192.168.1.2', curr=-1}, ServerConfig{name='192.168.1.3', curr=-1}]

第13次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=2}, ServerConfig{name='192.168.1.2', curr=-1}, ServerConfig{name='192.168.1.3', curr=-1}]
第13次选中的实例:192.168.1.1
第14次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=7}, ServerConfig{name='192.168.1.2', curr=0}, ServerConfig{name='192.168.1.3', curr=0}]

第14次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=0}, ServerConfig{name='192.168.1.2', curr=0}, ServerConfig{name='192.168.1.3', curr=0}]
第14次选中的实例:192.168.1.1
第15次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=5}, ServerConfig{name='192.168.1.2', curr=1}, ServerConfig{name='192.168.1.3', curr=1}]

第15次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-2}, ServerConfig{name='192.168.1.2', curr=1}, ServerConfig{name='192.168.1.3', curr=1}]
第15次选中的实例:192.168.1.1
第16次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=3}, ServerConfig{name='192.168.1.2', curr=2}, ServerConfig{name='192.168.1.3', curr=2}]

第16次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-4}, ServerConfig{name='192.168.1.2', curr=2}, ServerConfig{name='192.168.1.3', curr=2}]
第16次选中的实例:192.168.1.1
第17次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=1}, ServerConfig{name='192.168.1.2', curr=3}, ServerConfig{name='192.168.1.3', curr=3}]

第17次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=1}, ServerConfig{name='192.168.1.2', curr=-4}, ServerConfig{name='192.168.1.3', curr=3}]
第17次选中的实例:192.168.1.2
第18次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=6}, ServerConfig{name='192.168.1.2', curr=-3}, ServerConfig{name='192.168.1.3', curr=4}]

第18次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=-1}, ServerConfig{name='192.168.1.2', curr=-3}, ServerConfig{name='192.168.1.3', curr=4}]
第18次选中的实例:192.168.1.1
第19次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=4}, ServerConfig{name='192.168.1.2', curr=-2}, ServerConfig{name='192.168.1.3', curr=5}]

第19次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=4}, ServerConfig{name='192.168.1.2', curr=-2}, ServerConfig{name='192.168.1.3', curr=-2}]
第19次选中的实例:192.168.1.3
第20次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=9}, ServerConfig{name='192.168.1.2', curr=-1}, ServerConfig{name='192.168.1.3', curr=-1}]

第20次选中后的当前权重:[ServerConfig{name='192.168.1.1', curr=2}, ServerConfig{name='192.168.1.2', curr=-1}, ServerConfig{name='192.168.1.3', curr=-1}]
第20次选中的实例:192.168.1.1
第21次选中前的当前权重:[ServerConfig{name='192.168.1.1', curr=7}, ServerConfig{name='192.168.1.2', curr=0}, ServerConfig{name='192.168.1.3', curr=0}]

[192.168.1.1, 192.168.1.1, 192.168.1.2, 192.168.1.1, 192.168.1.3, 192.168.1.1, 192.168.1.1, 192.168.1.1, 192.168.1.1, 192.168.1.2, 192.168.1.1, 192.168.1.3, 192.168.1.1, 192.168.1.1, 192.168.1.1, 192.168.1.1, 192.168.1.2, 192.168.1.1, 192.168.1.3, 192.168.1.1]

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端码匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值