iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 负载均衡的 5 种算法实现原理
  • 839
分享到

Java 负载均衡的 5 种算法实现原理

2024-04-02 19:04:59 839人浏览 八月长安

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

摘要

目录一、负载均衡算法简介1、轮询法2、随机法3、源地址哈希法4、加权轮询法5、加权随机法二、代码实现负载均衡五种算法1.轮询法2.加权轮询法3.随机法4.加权随机5.源地址哈希法 前

前言:

什么是负载均衡:

指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种 负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服 务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能;

一、负载均衡算法简介

1、轮询法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载;

2、随机法

通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多, 其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果;

3、源地址哈希法

源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问;

4、加权轮询法

不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端;

5、加权随机法

与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序;

二、代码实现负载均衡五种算法

1.轮询法


import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestRoundRobin {  
    // 1.定义map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",1); 
        ipMap.put("192.168.13.3",1); 
    } 
// Integer sum=0; 
    Integer  pos = 0; 
    public String RoundRobin(){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        // 2.取出来key,放到set中 
        Set<String> ipset=ipServerMap.keySet(); 
        // 3.set放到list,要循环list取出 
        ArrayList<String> iplist=new ArrayList<String>(); 
        iplist.addAll(ipset); 
        String serverName=null; 
        // 4.定义一个循环的值,如果大于set就从0开始 
        synchronized(pos){ 
            if (pos>=ipset.size()){ 
                pos=0; 
            } 
            serverName=iplist.get(pos); 
            //轮询+1 
            pos ++; 
        } 
        return serverName; 
    } 
    public  static  void main(String[] args) { 
        TestRoundRobin testRoundRobin=new TestRoundRobin(); 
        for ( int i=0;i<10;i++){ 
            String serverIp=testRoundRobin.RoundRobin(); 
            System.out.println(serverIp); 
        } 
    } 
} 

2.加权轮询法


import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestWeightRobin { 
    //    1.map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    Integer pos=0; 
    public String WeightRobin(){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        Set<String> ipSet=ipServerMap.keySet(); 
        Iterator<String> ipIterator=ipSet.iterator(); 
        //定义一个list放所有server 
        ArrayList<String> ipArrayList=new ArrayList<String>(); 
        //循环set,根据set中的可以去得知map中的value,给list中添加对应数字的server数量 
        while (ipIterator.hasNext()){ 
            String serverName=ipIterator.next(); 
            Integer weight=ipServerMap.get(serverName); 
            for ( int i = 0;i < weight ;i++){ 
                ipArrayList.add(serverName); 
            } 
        } 
        String serverName=null; 
        if (pos>=ipArrayList.size()){ 
            pos=0; 
        } 
        serverName=ipArrayList.get(pos); 
        //轮询+1 
        pos ++; 
        return  serverName; 
    } 
    public  static  void main(String[] args) { 
        TestWeightRobin testWeightRobin=new TestWeightRobin(); 
        for ( int i =0;i<10;i++){ 
            String server=testWeightRobin.WeightRobin(); 
            System.out.println(server); 
        } 
    } 
} 

3.随机法


import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestRandom { 
    //    1.定义map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    public String Random() { 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        Set<String> ipSet=ipServerMap.keySet(); 
        //定义一个list放所有server 
        ArrayList<String> ipArrayList=new ArrayList<String>(); 
        ipArrayList.addAll(ipSet); 
        //循环随机数 
        Random random=new Random(); 
        //随机数在list数量中取(1-list.size) 
        int pos=random.nextInt(ipArrayList.size()); 
        String serverNameReturn= ipArrayList.get(pos); 
        return  serverNameReturn; 
    } 
    public  static  void main(String[] args) { 
        TestRandom testRandom=new TestRandom(); 
        for ( int i =0;i<10;i++){ 
            String server=testRandom.Random(); 
            System.out.println(server); 
        } 
    } 
} 

4.加权随机


import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestRobinRandom { 
    //    1.定义map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    public String RobinRandom(){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        Set<String> ipSet=ipServerMap.keySet(); 
        Iterator<String> ipIterator=ipSet.iterator(); 
        //定义一个list放所有server 
        ArrayList<String> ipArrayList=new ArrayList<String>(); 
        //循环set,根据set中的可以去得知map中的value,给list中添加对应数字的server数量 
        while (ipIterator.hasNext()){ 
            String serverName=ipIterator.next(); 
            Integer weight=ipServerMap.get(serverName); 
            for ( int i=0;i<weight;i++){ 
                ipArrayList.add(serverName); 
            } 
        } 
        //循环随机数 
        Random random=new Random(); 
        //随机数在list数量中取(1-list.size) 
        int pos=random.nextInt(ipArrayList.size()); 
        String serverNameReturn= ipArrayList.get(pos); 
        return  serverNameReturn; 
    } 
    public  static  void main(String[] args) { 
        TestRobinRandom testRobinRandom=new TestRobinRandom(); 
        for ( int i =0;i<10;i++){ 
            String server=testRobinRandom.RobinRandom(); 
            System.out.println(server); 
        } 
    } 
} 

5.源地址哈希法


import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 
import java.util.concurrent.ConcurrentHashMap; 
public  class ipHash { 
    //    1.定义map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    public String ipHash(String clientIP){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        //    2.取出来key,放到set中 
        Set<String> ipset=ipServerMap.keySet(); 
        //    3.set放到list,要循环list取出 
        ArrayList<String> iplist=new ArrayList<String>(); 
        iplist.addAll(ipset); 
        //对ip的hashcode值取余数,每次都一样的 
        int hashCode=clientIP.hashCode(); 
        int serverListsize=iplist.size(); 
        int pos=hashCode%serverListsize; 
        return iplist.get(pos); 
    } 
    public  static  void main(String[] args) { 
        ipHash iphash=new ipHash(); 
        String servername= iphash.ipHash("192.168.21.2"); 
        System.out.println(servername); 
    } 
} 

到此这篇关于Java 负载均衡的 5 种算法实现原理的文章就介绍到这了,更多相关Java 负载均衡的 算法实现原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 负载均衡的 5 种算法实现原理

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

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

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

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

下载Word文档
猜你喜欢
  • Java 负载均衡的 5 种算法实现原理
    目录一、负载均衡算法简介1、轮询法2、随机法3、源地址哈希法4、加权轮询法5、加权随机法二、代码实现负载均衡五种算法1.轮询法2.加权轮询法3.随机法4.加权随机5.源地址哈希法 前...
    99+
    2024-04-02
  • Java实现5种负载均衡算法(小结)
    目录概念轮询算法加权轮询法加权随机法随机法IP_Hash算法概念 负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server。其中有好几个种经典的算法,下面我们用Java...
    99+
    2024-04-02
  • 使用Java实现5种负载均衡算法实例
    目录前言概念 几种负载均衡算法图例轮询算法 加权轮询法 加权随机法 随机法 IP_Hash算法 总结前言 负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给...
    99+
    2024-04-02
  • 6种负载均衡算法
    当今的分布式系统越来越普遍,由于它们能够提供更高的灵活性和可扩展性。但是,这些系统需要处理大量的客户端请求。为了处理这些请求并提供对每个客户端的稳定和高效的服务,需要使用负载均衡算法。 以下是分布式系统中常用的负载均衡算法: &#x...
    99+
    2023-09-10
    负载均衡 java 数据库 运维 服务器
  • Java怎么实现负载均衡算法
    这篇文章主要讲解了“Java怎么实现负载均衡算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现负载均衡算法”吧!什么是负载均衡(Load balancing)?在网站创立初期...
    99+
    2023-06-02
  • Nginx负载均衡中的fair算法原理与实现
    在分布式系统中,负载均衡是非常重要的一环。Nginx作为一款高性能的Web服务器和反向代理服务器,具备了负载均衡的功能。Nginx提供了多种负载均衡算法,其中fair算法是一种比较常用的算法。fair算法的原理fair算法是基于权重的负载均...
    99+
    2023-10-21
    nginx 负载均衡 fair算法
  • Java 中怎么实现负载均衡算法
    Java 中怎么实现负载均衡算法,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、完全随机算法缺点:所有服务器的访问概率都是相同的。packa...
    99+
    2024-04-02
  • Nginx负载均衡原理与实现
    引言:随着网站访问量的不断增加,服务器的负载压力也越来越大。为了解决这个问题,负载均衡应运而生。Nginx作为一款高性能的开源反向代理服务器,被广泛应用于负载均衡的场景中。本文将介绍Nginx负载均衡的原理和实现方法,并附上具体的代码示例。...
    99+
    2023-10-21
    nginx 实现 负载均衡
  • 如何理解多种负载均衡算法及其Java代码实现
    本篇文章为大家展示了如何理解多种负载均衡算法及其Java代码实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先给大家介绍下什么是负载均衡负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明...
    99+
    2023-06-17
  • hadoop负载均衡算法怎么实现
    Hadoop负载均衡算法的实现可以通过以下几种方式: 数据均衡:Hadoop中的数据均衡是通过HDFS的数据均衡来实现的。HDF...
    99+
    2024-04-18
    hadoop
  • nginx负载均衡算法及原理是什么
    Nginx负载均衡算法及原理主要涉及以下几个方面:1. 轮询(Round Robin)算法:Nginx默认采用的是轮询算法,即将请求...
    99+
    2023-10-08
    nginx
  • 负载均衡的实现方法
    这篇文章主要讲解了“负载均衡的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“负载均衡的实现方法”吧!    客户端发送多个请求到服务器,服务器...
    99+
    2023-06-20
  • lvs中有多少种负载均衡算法
    lvs中有10种负载均衡算法,分别是:1、轮询调度,RR算法;2、加权轮询调度,WRR算法;3、最小连接调度,LC算法;4、加权最小连接调度,WLC算法;5、基于局部的最少连接,LBLC算法;6、带复制的基于局部性的最少连接,LBLCR算法...
    99+
    2024-04-02
  • dubbo负载均衡的实现原理是什么
    Dubbo负载均衡的实现原理是通过在服务提供方和消费方之间选择合适的调用方式和节点来实现负载均衡。具体原理如下: 服务提供方:在...
    99+
    2024-04-09
    dubbo
  • Golang实现四种负载均衡的算法(随机,轮询等)
    随机负载 随机挑选目标服务器 package load_balance import ( "errors" "math/rand" ) //随机负载均衡 type Ran...
    99+
    2024-04-02
  • Ribbon负载均衡算法原理与使用介绍
    负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始。 List<ServiceInstance...
    99+
    2024-04-02
  • 怎么使用Java实现常见的负载均衡算法
    在Java中实现常见的负载均衡算法,可以使用以下几种方法: 轮询算法(Round Robin):实现一个列表来存储服务器节点,并...
    99+
    2024-04-09
    Java
  • 了解Nginx负载均衡算法fair的工作原理
    引言:在高并发场景下,单个服务器可能无法满足用户的请求。为了提高服务器的处理能力和稳定性,常常会使用负载均衡技术。Nginx作为一款高性能的Web服务器和反向代理服务器,其内置的负载均衡模块提供了多种算法供选择。其中"fair"算法是一种基...
    99+
    2023-10-21
    nginx 负载均衡 fair算法
  • IIS下的负载均衡与IIS+Nginx实现负载均衡、反向代理
    在IIS下实现负载均衡可以使用Microsoft提供的Application Request Routing(ARR)模块。ARR可...
    99+
    2023-09-01
    IIS
  • Centos实现负载均衡的方法
    这篇文章主要讲解了“Centos实现负载均衡的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Centos实现负载均衡的方法”吧!为了提高系统的高可用性,我们可以将两个或多个网卡进行绑定,...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作