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

目录
  • 一、负载均衡算法简介
    • 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 负载均衡的 算法实现原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Java实现负载均衡的几种算法代码

    本篇文章主要介绍Java实现负载均衡的几种算法,具体如下: 轮询: package class2.zookeeper.loadbalance; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 負載均衡算法,輪詢法 * @author guoy * */ public class TestRoundRobin { static Map<St

  • 使用Java实现5种负载均衡算法实例

    目录 前言 概念 几种负载均衡算法图例 轮询算法 加权轮询法 加权随机法 随机法 IP_Hash算法 总结 前言 负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给各个server.其中有好几个种经典的算法.在用java代码编写这几种算法之前,先来了解一下负载均衡这个概念. 概念 负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server.其中有好几个种经典的算法,下面我们用Java实现这几种算法. 几种负载均衡算法图例 主要的负载均衡算法是图中这些,在代码

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

    目录 一.负载均衡算法简介 1.轮询法 2.随机法 3.源地址哈希法 4.加权轮询法 5.加权随机法 二.代码实现负载均衡五种算法 1.轮询法 2.加权轮询法 3.随机法 4.加权随机 5.源地址哈希法 前言: 什么是负载均衡: 指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种 负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求.负载均衡能够平均分配客户请求

  • Java 负载均衡算法作用详细解析

    目录 前言 轮询算法 随机算法 加权随机算法 加权轮询算法 源地址hash算法 最小请求数算法 前言 负载均衡在Java领域中有着广泛深入的应用,不管是大名鼎鼎的nginx,还是微服务治理组件如dubbo,feign等,负载均衡的算法在其中都有着实际的使用 负载均衡的核心思想在于其底层的算法思想,比如大家熟知的算法有 轮询,随机,最小连接,加权轮询等,在现实中不管怎么配置,都离不开其算法的核心原理,下面将结合实际代码对常用的负载均衡算法做一些全面的总结. 轮询算法 轮询即排好队,一个接一个的轮着

  • Java负载均衡算法实现之轮询和加权轮询

    目录 1.普通轮询算法 2.加权轮询算法 2.1.实现方式一 2.2.实现方式二(重点难点) 2.2.1.概述 2.2.2.举个例子理解算法 2.2.3.代码实现 总结 1.普通轮询算法 轮询(Round Robin,RR)是依次将用户的访问请求,按循环顺序分配到web服务节点上,从1开始到最后一台服务器节点结束,然后再开始新一轮的循环.这种算法简单,但是没有考虑到每台节点服务器的具体性能,请求分发往往不均衡. 代码实现: /** * 普通轮询算法 */public class RoundRob

  • 简单了解Nginx七层负载均衡的几种调度算法

    这篇文章主要介绍了简单了解Nginx七层负载均衡的几种调度算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Nginx是一款轻量级的高性能web服务器,同时也是一款非常优秀的负载均衡器和反向代理服务器.由于支持强大的正则匹配规则.动静分离.URLrewrite功能及安装配置简单且对网络稳定性依赖非常小等优点,所以常用来做为七层负载均衡使用.在硬件不差的情况下,通常可以稳定支持几万的并发连接,在硬件性能足够好,且对系统内核参数及Nginx配置进

  • Java求最小生成树的两种算法详解

    目录 1 最小生成树的概述 2 普里姆算法(Prim) 2.1 原理 2.2 案例分析 3 克鲁斯卡尔算法(Kruskal) 3.1 原理 3.2 案例分析 4 邻接矩阵加权图实现 5 邻接表加权图实现 6 总结 介绍了图的最小生成树的概念,然后介绍了求最小生成树的两种算法:Prim算法和Kruskal算法的原理,最后提供了基于邻接矩阵和邻接链表的图对两种算法的Java实现. 阅读本文需要一定的图的基础,如果对于图不是太明白的可以看看这篇文章:Java数据结构之图的原理与实现. 1 最小生成树的

  • Java实现全排列的三种算法详解

    目录 算法一 算法二 算法三 算法一 基于递归与回溯实现.在排列1,2,3的时候,先由3向上回溯到2发现没有其他可能的情况,再回溯到1,排列为1,3,2再向上回溯到存在其他情况时,即根节点然后再排列以2为第一位的情况,重复上述过程将所有可能结果全部放入res中. 代码: import java.util.ArrayList; import java.util.List; public class h618_1 { static List<List<Integer>> res = n

  • 服务器负载均衡是什么意思(服务器负载均衡的基本功能和实现原理)

    什么是负载均衡? 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外供应效力而无须其他服务器的辅助.经过某种负载分管技术,将外部发送来的央求均匀分配到对称结构中的某一台服务器上,而接收到央求的服务器独登时回应客户的央求.均衡负载可以平均分配客户央求到服务器列阵,籍此供应快速获取重要数据,解决很多并发访问效力问题.这种群集技术可以用最少的出资取得接近于大型主机的性能. 负载均衡的类型 根据DNS的负载均衡 经过DNS效力中的随机姓名解析来完结负载均衡,

  • 详解Nginx服务器之负载均衡策略(6种)

    一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器.详情请查看我的另一篇博客. 二.Nginx负载均衡策略 负载均衡用于从"upstream"模块定义的后端服务器列表中选取一台服务器接受用户的请求.一个最基本的upstream模块是这样的,模块内的server是服务器列表: #动态服务器组 upstream dynamic_zuoyu { server localhost:8

  • Nginx负载均衡的4种方案配置实例

    1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器. 配置的例子如下: http{ upstream sampleapp { server <<dns entry or IP Address(optional with port)>>; server <<another dns entry or IP Address(optional with port)>>; } .... server{

随机推荐