千家信息网

使用Java实现5种负载均衡算法的方法教程

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇内容介绍了"使用Java实现5种负载均衡算法的方法教程"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2024年09月22日使用Java实现5种负载均衡算法的方法教程

本篇内容介绍了"使用Java实现5种负载均衡算法的方法教程"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 前言

  • 概念

  • 几种负载均衡算法图例

  • 轮询算法

  • 加权轮询法

  • 加权随机法

  • 随机法

  • IP_Hash算法

  • 总结

前言

负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给各个server。其中有好几个种经典的算法。在用java代码编写这几种算法之前,先来了解一下负载均衡这个概念。

概念

负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server。其中有好几个种经典的算法,下面我们用Java实现这几种算法。

几种负载均衡算法图例


主要的负载均衡算法是图中这些,在代码实现之前,我们先简单回顾一下他们的概念。

轮询算法

轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。

优点:绝对公平

缺点:无法根据服务器性能去分配,无法合理利用服务器资源。

package com.monkeyjava.learn.basic.robin;import com.google.common.collect.Lists;import java.util.HashMap;import java.util.List;import java.util.Map;public class TestRound {    private Integer  index = 0;    private List ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");    public String roundRobin(){        String serverIp;        synchronized(index){            if (index >= ips.size()){                index = 0;            }            serverIp= ips.get(index);            //轮询+1            index ++;        }        return serverIp;    }    public static void main(String[] args) {        TestRound testRoundRobin =new TestRound();        for (int i=0;i< 10 ;i++){            String serverIp= testRoundRobin.roundRobin();            System.out.println(serverIp);        }    }}

输出结果:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.1

加权轮询法

该算法中,每个机器接受的连接数量是按权重比例分配的。这是对普通轮询算法的改进,比如你可以设定:第三台机器的处理能力是第一台机器的两倍,那么负载均衡器会把两倍的连接数量分配给第3台机器,轮询可以将请求顺序按照权重分配到后端。

package com.monkeyjava.learn.basic.robin;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class TestWeight {    private Integer index = 0;    static Map ipMap=new HashMap(16);    static {        // 1.map, key-ip,value-权重        ipMap.put("192.168.1.1", 1);        ipMap.put("192.168.1.2", 2);        ipMap.put("192.168.1.3", 4);    }    public List getServerIpByWeight() {        List ips = new ArrayList(32);        for (Map.Entry entry : ipMap.entrySet()) {            String ip = entry.getKey();            Integer weight = entry.getValue();            // 根据权重不同,放入list 中的数量等同于权重,轮询出的的次数等同于权重            for (int ipCount =0; ipCount < weight; ipCount++) {                ips.add(ip);            }        }        return ips;    }    public String weightRobin(){        List ips = this.getServerIpByWeight();        if (index >= ips.size()){            index = 0;        }        String serverIp= ips.get(index);        index ++;        return  serverIp;    }    public static void main(String[] args) {        TestWeight testWeightRobin=new TestWeight();        for (int i =0;i< 10 ;i++){            String server=testWeightRobin.weightRobin();            System.out.println(server);        }    }}

输出结果:

192.168.1.1
192.168.1.3
192.168.1.3
192.168.1.3
192.168.1.3
192.168.1.2
192.168.1.2
192.168.1.1
192.168.1.3
192.168.1.3

加权随机法

获取带有权重的随机数字,随机这种东西,不能看绝对,只能看相对,我们不用index 控制下标进行轮询,只用random 进行随机取ip,即实现算法。

package com.monkeyjava.learn.basic.robin;import java.util.*;public class TestRandomWeight {    static Map ipMap=new HashMap(16);    static {        // 1.map, key-ip,value-权重        ipMap.put("192.168.1.1", 1);        ipMap.put("192.168.1.2", 2);        ipMap.put("192.168.1.3", 4);    }    public List getServerIpByWeight() {        List ips = new ArrayList(32);        for (Map.Entry entry : ipMap.entrySet()) {            String ip = entry.getKey();            Integer weight = entry.getValue();            // 根据权重不同,放入list 中的数量等同于权重,轮询出的的次数等同于权重            for (int ipCount =0; ipCount < weight; ipCount++) {                ips.add(ip);            }        }        return ips;    }    public String randomWeightRobin(){        List ips = this.getServerIpByWeight();        //循环随机数        Random random=new Random();        int index =random.nextInt(ips.size());        String serverIp = ips.get(index);        return  serverIp;    }    public static void main(String[] args) {        TestRandomWeight testRandomWeightRobin=new TestRandomWeight();        for (int i =0;i< 10 ;i++){            String server= testRandomWeightRobin.randomWeightRobin();            System.out.println(server);        }    }}

输出结果:

192.168.1.3
192.168.1.3
192.168.1.2
192.168.1.1
192.168.1.2
192.168.1.1
192.168.1.3
192.168.1.2
192.168.1.2
192.168.1.3

随机法

负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,这种实现算法最简单,随之调用次数增大,这种算法可以达到每台服务器的请求量接近于平均。

package com.monkeyjava.learn.basic.robin;import com.google.common.collect.Lists;import java.util.List;import java.util.Random;public class TestRandom {    private List ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");    public String randomRobin(){        //随机数        Random random=new Random();        int index =random.nextInt(ips.size());        String serverIp= ips.get(index);        return  serverIp;    }    public static void main(String[] args) {        TestRandom testRandomdRobin =new TestRandom();        for (int i=0;i< 10 ;i++){            String serverIp= testRandomdRobin.randomRobin();            System.out.println(serverIp);        }    }}

输出

192.168.1.3
192.168.1.3
192.168.1.1
192.168.1.2
192.168.1.1
192.168.1.3
192.168.1.2
192.168.1.3
192.168.1.3
192.168.1.2

IP_Hash算法

hash(ip)%N算法,通过一种散列算法把客户端来源IP根据散列取模算法将请求分配到不同的服务器上

优点:保证了相同客户端IP地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的session会话

缺点: 如果服务器进行了下线操作,源IP路由的服务器IP就会变成另外一台,如果服务器没有做session 共享话,会造成session丢失。

package com.monkeyjava.learn.basic.robin;import com.google.common.collect.Lists;import java.util.List;public class TestIpHash {    private List ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");    public String ipHashRobin(String clientIp){        int hashCode=clientIp.hashCode();        int serverListsize=ips.size();        int index = hashCode%serverListsize;        String serverIp= ips.get(index);        return  serverIp;    }    public static void main(String[] args) {        TestIpHash testIpHash =new TestIpHash();        String servername= testIpHash.ipHashRobin("192.168.88.2");        System.out.println(servername);    }}

输出结果

192.168.1.3

每次运行结果都一样

"使用Java实现5种负载均衡算法的方法教程"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0