在分布式系统中,为了实现系统的高性能、高并发、高可用,在构架中都会进行负载均衡设计,它是分布式系统的核心和中枢,负载均衡的好坏直接影响着整个系统的性能。负载均衡分为软件均衡和硬件均衡两类,比如apache、nginx、dubbo 等属于软件负载均衡,F5属于硬件负载均衡,当然他们都会使用到负载均衡算法。

常见的负载均衡算法包含:
1、轮询法(Round Robin)
2、加权轮询法(Weight Round Robin)
3、随机法(Random)
4、加权随机法(Weight Random)
5、平滑加权轮询法(Smooth Weight Round Robin)
6、源地址哈希法(Hash)
7、最小连接数法(Least Connections)

接下来的博客中会一一介绍如上几种算法,本文介绍轮询法。

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

算法描述

假设有 N 台服务器 S = {S0, S1, S2, …, Sn},算法可以描述为:
1、从 S0 开始依次调度 S1, S2, …, Sn;
2、若所有服务器都已被调度过,则从头开始调度;

假定我们现在有如下四台服务器:

服务器地址 权重
192.168.1.1 1
192.168.1.2 2
192.168.1.3 3
192.168.1.4 4

轮训算法调度如下:

服务器地址 序号
192.168.1.1 1
192.168.1.2 2
192.168.1.3 3
192.168.1.4 4
192.168.1.1 5
192.168.1.2 6
192.168.1.3 7
192.168.1.4 8

轮训算法与服务器权重没有关系,每个服务器有序的会被轮训到。

代码实现

1、服务器管理类

package org.learn.loadbalance;import java.util.Map;
import java.util.TreeMap;/*** @author zhibo* @date 2019/5/16 16:25*/
public class ServerManager {public static Map<String, Integer> serverMap = new TreeMap<>();static {serverMap.put("192.168.1.1", 1);serverMap.put("192.168.1.2", 2);serverMap.put("192.168.1.3", 3);serverMap.put("192.168.1.4", 4);}
}

2、轮询类

package org.learn.loadbalance;import java.util.ArrayList;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;/*** @author zhibo* @date 2019/5/16 16:28*/
public class RoundRobin {private static AtomicInteger indexAtomic = new AtomicInteger(0);public static String getServer() {Set<String> serverSet = ServerManager.serverMap.keySet();ArrayList<String> serverList = new ArrayList<>(serverSet);if (indexAtomic.get() >= serverList.size()) {indexAtomic.set(0);}String server = serverList.get(indexAtomic.getAndIncrement());return server;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {String server = getServer();System.out.println(server);}}
}

1、使用 AtomicInteger 进行轮询索引的增减,保证并发的安全性。
2、在多线程的情况下, 线程A修改 ServerManager.serverMap 的值,线程B无法即时拿到线程A修改后的值,因此可能会产生请求错误,需要调用端进行容错处理。

执行 main 方法输出结果如下:

文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

负载均衡算法--轮询法(Round Robin)相关推荐

  1. 负载均衡算法 — 轮询

    负载均衡算法 - 轮询 目录 概述 简单轮询 加权轮询 平滑加权轮询 1. 概述 在分布式系统中,为了实现负载均衡,必然会涉及到负载调度算法,如 Nginx 和 RPC 服务发现等场景.常见的负载均衡 ...

  2. 负载均衡算法-轮询均衡

    ①轮询均衡( Round Robin):每一次来自网络的请求轮流分配给内部服务器.从1至N然后重新开始.此种均衡算法适合于服务器组中的所有服务器都有相同的软.硬件配置并且平均服务请求量相对均衡的情况.

  3. nginx负载均衡 加权轮询和ip_hash

    下面给大家总结了几种真正的nginx负载均衡的功能了,在此我们加了一个权重判断法就是根据nginx负载的状态实现分配访问用户到权重值少的机器了,具体配置如下. nginx为后端web服务器(apach ...

  4. 负载均衡--加权轮询算法(Weight Round)

    加权轮询算法:不同的后端服务器,在机器的配置和当前系统的负载方面,可能并不相同.因此,它们的抗压能力也不相同.给配置高.负载低的机器配置更高的权重,让其处理更多的请求:给配置低.负载高的机器分配较低的 ...

  5. Nginx学习之十二-负载均衡-加权轮询策略剖析

    本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...

  6. 负载均衡算法1--轮询

    轮询算法分为简单轮询(Round-Robin)和加权轮询(Weighted-Round-Robin). 简单轮询(Round-Robin) 简单轮询是最简单的一种负载均衡算法,其把来自用户的请求轮流分 ...

  7. spring boot robin 负载均衡之轮询策略

    轮询策略 robin的负载均衡默认的是轮询策略,假如微服务有A.B 2个节点,第一次请求时,访问A节点,第二次访问B节点,第三次访问A节点..... 实现思路 记录请求的次数为a,微服务节点个数为b, ...

  8. sofa-rpc负载均衡之轮询算法分析(RoundRobin)

    2019独角兽企业重金招聘Python工程师标准>>> 注意:我们分析的sofa-rpc版本是5.4.0. 图1 RoundRobinLoadBalancer的类继承图 1.一般的R ...

  9. 应用交换技术的负载均衡算法

    原文出处是:http://hi.baidu.com/ruijievideo/blog/item/5959be1f3c1621ff1bd576d2.html 应用交换技术的负载均衡算法 应用交换技术里主 ...

最新文章

  1. python可以修图吗_会照片处理的不只是ps,还有Python!
  2. 阿加莎•克里斯蒂作品04东方快车谋杀案
  3. Java最佳实践–字符串性能和精确字符串匹配
  4. 普通函数被类引用为友元函数
  5. 20145206《Java程序设计》实验五Java网络编程及安全
  6. 疾病自动编码任务的调研(二)——相关比赛及数据集
  7. 单日复利,单月复利计算java实现
  8. syncthing同步慢_使用Syncthing在多个设备上同步文件
  9. go语言报错reflect: reflect.Value.SetInt using value obtained using unexported field 解决方法
  10. Hexo添加Live2D看板娘最新教程
  11. 微信支付接口的参数规定
  12. jquery 绘图工具 flot 使用
  13. Element组件(input输入框)
  14. 为Nextcloud中的视频文件配置缩略图
  15. Jove:@AlanCui 在手机上用QQ或GTalk来贴Fanfou吧, 不用敲空格或省略号. 好像你输入多少个中文字符就要补多少个空格...
  16. 钢管直线度重要性 在线直线度测量仪保证质量
  17. 如何安全的修改win11用户名(微软账号登录,用户名会变成纯数字,好丑)
  18. 数据治理项目之数据管理模板
  19. A1-2017级算法上机第一次练习赛 K 画个圈圈诅咒你
  20. 汽车上的LIN通讯(一)

热门文章

  1. 环签名、群签名、DAA协议原理
  2. IQtree的下载与安装
  3. 2017MWC 西班牙MWC MWC门票 MWC邀请函 MWC观展
  4. 手把手教学,带你在Linux、OS X、Windows下Docker的安装
  5. dp交换机命令_华为交换机配置命令解释
  6. enable 华为交换机ntdp_华为交换机配置命令超详解
  7. 华为重启交换机命令_华为交换机配置命令后需要重启吗
  8. 红米Note(4G双卡通刷版)线刷兼救砖_解账户锁_纯净刷机包_教程
  9. tcpip通讯 matlab,TCPIP通信
  10. iphone xr xs_如何在iPhone XR上设置触觉触摸