广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现5种负载均衡算法(小结)
  • 112
分享到

Java实现5种负载均衡算法(小结)

2024-04-02 19:04:59 112人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录概念轮询算法加权轮询法加权随机法随机法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<String> 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<String, Integer> ipMap=new HashMap<String, Integer>(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<String> getServerIpByWeight() {
        List<String> ips = new ArrayList<String>(32);
        for (Map.Entry<String, Integer> 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<String> 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<String, Integer> ipMap=new HashMap<String, Integer>(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<String> getServerIpByWeight() {
        List<String> ips = new ArrayList<String>(32);
        for (Map.Entry<String, Integer> 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<String> 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<String> 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<String> 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种负载均衡算法(小结)的文章就介绍到这了,更多相关Java 负载均衡 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现5种负载均衡算法(小结)

本文链接: https://www.lsjlt.com/news/150320.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现5种负载均衡算法(小结)
    目录概念轮询算法加权轮询法加权随机法随机法IP_Hash算法概念 负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server。其中有好几个种经典的算法,下面我们用Java...
    99+
    2022-11-13
  • Java 负载均衡的 5 种算法实现原理
    目录一、负载均衡算法简介1、轮询法2、随机法3、源地址哈希法4、加权轮询法5、加权随机法二、代码实现负载均衡五种算法1.轮询法2.加权轮询法3.随机法4.加权随机5.源地址哈希法 前...
    99+
    2022-11-12
  • 使用Java实现5种负载均衡算法实例
    目录前言概念 几种负载均衡算法图例轮询算法 加权轮询法 加权随机法 随机法 IP_Hash算法 总结前言 负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给...
    99+
    2022-11-12
  • 6种负载均衡算法
    当今的分布式系统越来越普遍,由于它们能够提供更高的灵活性和可扩展性。但是,这些系统需要处理大量的客户端请求。为了处理这些请求并提供对每个客户端的稳定和高效的服务,需要使用负载均衡算法。 以下是分布式系统中常用的负载均衡算法: &#x...
    99+
    2023-09-10
    负载均衡 java 数据库 运维 服务器
  • Java怎么实现负载均衡算法
    这篇文章主要讲解了“Java怎么实现负载均衡算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现负载均衡算法”吧!什么是负载均衡(Load balancing)?在网站创立初期...
    99+
    2023-06-02
  • Java 中怎么实现负载均衡算法
    Java 中怎么实现负载均衡算法,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、完全随机算法缺点:所有服务器的访问概率都是相同的。packa...
    99+
    2022-10-19
  • lvs中有多少种负载均衡算法
    lvs中有10种负载均衡算法,分别是:1、轮询调度,RR算法;2、加权轮询调度,WRR算法;3、最小连接调度,LC算法;4、加权最小连接调度,WLC算法;5、基于局部的最少连接,LBLC算法;6、带复制的基于局部性的最少连接,LBLCR算法...
    99+
    2022-10-09
  • 如何理解多种负载均衡算法及其Java代码实现
    本篇文章为大家展示了如何理解多种负载均衡算法及其Java代码实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先给大家介绍下什么是负载均衡负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明...
    99+
    2023-06-17
  • Golang实现四种负载均衡的算法(随机,轮询等)
    随机负载 随机挑选目标服务器 package load_balance import ( "errors" "math/rand" ) //随机负载均衡 type Ran...
    99+
    2022-11-12
  • 负载均衡的实现方法
    这篇文章主要讲解了“负载均衡的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“负载均衡的实现方法”吧!    客户端发送多个请求到服务器,服务器...
    99+
    2023-06-20
  • Java负载均衡算法实现之轮询和加权轮询
    目录1.普通轮询算法2.加权轮询算法2.1.实现方式一2.2.实现方式二(重点难点)2.2.1.概述2.2.2.举个例子理解算法2.2.3.代码实现总结1.普通轮询算法 轮询(Rou...
    99+
    2022-11-13
  • Java 负载均衡算法作用详细解析
    目录前言轮询算法随机算法加权随机算法加权轮询算法源地址hash算法最小请求数算法前言 负载均衡在Java领域中有着广泛深入的应用,不管是大名鼎鼎的nginx,还是微服务治理组件如du...
    99+
    2022-11-13
  • 服务器的负载均衡算法怎么实现
    这篇文章主要介绍“服务器的负载均衡算法怎么实现”,在日常操作中,相信很多人在服务器的负载均衡算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”服务器的负载均衡算法怎么实现”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-03
  • Centos实现负载均衡的方法
    这篇文章主要讲解了“Centos实现负载均衡的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Centos实现负载均衡的方法”吧!为了提高系统的高可用性,我们可以将两个或多个网卡进行绑定,...
    99+
    2023-06-10
  • java负载均衡框架怎么实现
    在Java中,可以使用以下几种方式来实现负载均衡框架:1. 随机算法:通过随机选择一个可用的服务器来实现负载均衡。这种方式简单且易于...
    99+
    2023-10-12
    java
  • Nginx负载均衡中的fair算法原理与实现
    在分布式系统中,负载均衡是非常重要的一环。Nginx作为一款高性能的Web服务器和反向代理服务器,具备了负载均衡的功能。Nginx提供了多种负载均衡算法,其中fair算法是一种比较常用的算法。fair算法的原理fair算法是基于权重的负载均...
    99+
    2023-10-21
    nginx 负载均衡 fair算法
  • 使用Golang实现加权负载均衡算法的实现代码
    背景描述 如下图所示,负载均衡做为反向代理,将请求方的请求转发至后端的服务节点,实现服务的请求。 在nginx中可以通过upstream配置server时,设置weight表示对应...
    99+
    2022-11-12
  • MySQL实现负载均衡功能的方法
    小编给大家分享一下MySQL实现负载均衡功能的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言MySQL是一个高速度、高性能、多线程、开放源代码,建立在客户/服务器(Client/S...
    99+
    2022-10-18
  • mysql实现负载均衡方法是什么
    MySQL实现负载均衡的方法主要有以下几种:1. 基于软件的负载均衡:使用第三方软件或自行开发的负载均衡软件,如HAProxy、Ng...
    99+
    2023-09-07
    mysql 负载均衡
  • LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
    LVS(Linux Virtual Server)是一个高性能、可扩展的负载均衡器,用于分发网络流量到多个服务器上,提高系统的可用性...
    99+
    2023-09-20
    LVS负载均衡
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作