负载均衡-轮询-两种简易实现

1、描述

下游可用的服务器目前有5个(node),设计一个方法,方法没有任何参数,采用轮询的方式返回其中一个node;

2、使用环形链表

每次取下一个node即可。注意:需要保证线程安全!

// 节点定义
@Data
class Node {Node next;String name;String ip;}
// 环形状node集合
class LoadBalanceCycle {private Node head;private Node nextNode;/*** 添加节点*/public synchronized void addNode(String name, String ip) {Node newNode = new Node();newNode.name = name;newNode.ip = ip;if (head == null) {head = newNode;head.next = head;} else {Node temp = head;while (temp.next != head) {temp = temp.next;}temp.next = newNode;newNode.next = head;}}/*** 获取下一个节点*/public synchronized Node getNextNode() {if (nextNode == null) {nextNode = head;} else {nextNode = nextNode.next;}return nextNode;}}
// 测试验证
public static void main(String[] args) {LoadBalanceCycle loadBalanceCycle = new LoadBalanceCycle();for (int i = 0; i < 3; i++) {// 初始化三个节点的loadBalanceCycle.addNode("node1", "192.168.0.1");loadBalanceCycle.addNode("node2", "192.168.0.2");loadBalanceCycle.addNode("node3", "192.168.0.3");}AtomicInteger n1Count = new AtomicInteger();AtomicInteger n2Count = new AtomicInteger();AtomicInteger n3Count = new AtomicInteger();CountDownLatch latch = new CountDownLatch(30);// 多线程,返回负载均衡中的节点for (int i = 0; i < 3; i++) {new Thread(() -> {int j = 10;while (j > 0) {try {String name = loadBalanceCycle.getNextNode().getName();System.out.println(Thread.currentThread().getName() + " " + name);if ("node1".equals(name)) {n1Count.incrementAndGet();}if ("node2".equals(name)) {n2Count.incrementAndGet();}if ("node3".equals(name)) {n3Count.incrementAndGet();}j--;} finally {latch.countDown();}}}).start();}try {latch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("==============================负载均衡调用结果===================================");System.out.println("node1 被调用的次数: " + n1Count.get());System.out.println("node2 被调用的次数: " + n2Count.get());System.out.println("node3 被调用的次数: " + n3Count.get());}}

3、使用AtomicLong

long 类型的最大值?

这个值是 2^63 - 1,即 9223372036854775807,是 long 类型能表示的最大正数值。

是多少亿?

Long.MAX_VALUE 大约是 92233.72 亿。(如果你的请求次数即【负载均衡调用次数】会超过这个值,那么或许下面的例子会存在问题)

@Data
class Node2 {String name;String ip;public Node2(String node1, String s) {this.name = node1;this.ip = s;}
}

/*** 基于AtomicLong实现的一个结构*/
class LoadBalanceByAtomic {final List<Node2> nodeList = new ArrayList<>();AtomicLong mark = new AtomicLong(0);public void add(Node2 node) {synchronized (nodeList) {nodeList.add(node);}}public Node2 getNext() {long andIncrement = mark.getAndIncrement();return nodeList.get((int) (andIncrement % nodeList.size()));}}

测试代码

public static void main(String[] args) {LoadBalanceByAtomic loadBalanceByAtomic = new LoadBalanceByAtomic();for (int i = 0; i < 3; i++) {// 初始化三个节点的loadBalanceByAtomic.add(new Node2("node1", "192.168.0.1"));loadBalanceByAtomic.add(new Node2("node2", "192.168.0.2"));loadBalanceByAtomic.add(new Node2("node3", "192.168.0.3"));}AtomicInteger n1Count = new AtomicInteger();AtomicInteger n2Count = new AtomicInteger();AtomicInteger n3Count = new AtomicInteger();CountDownLatch latch = new CountDownLatch(30);// 多线程,返回负载均衡中的节点for (int i = 0; i < 3; i++) {new Thread(() -> {int j = 10;while (j > 0) {try {String name = loadBalanceByAtomic.getNext().getName();System.out.println(Thread.currentThread().getName() + " " + name);if ("node1".equals(name)) {n1Count.incrementAndGet();}if ("node2".equals(name)) {n2Count.incrementAndGet();}if ("node3".equals(name)) {n3Count.incrementAndGet();}j--;} finally {latch.countDown();}}}).start();}try {latch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("==============================负载均衡调用结果===================================");System.out.println("node1 被调用的次数: " + n1Count.get());System.out.println("node2 被调用的次数: " + n2Count.get());System.out.println("node3 被调用的次数: " + n3Count.get());}

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安泰高压功率放大器主要应用场景有哪些

高压功率放大器是一种专门设计用于处理高电压信号并提供大功率输出的设备。它们在各种领域中发挥着重要作用&#xff0c;以下是它们的主要应用场景和特点。 一、医疗设备 医疗成像&#xff1a;高压功率放大器在医疗成像设备中扮演关键角色&#xff0c;例如X射线设备和CT扫描仪。…

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏应用于称重测力控制仪表

称重测力控制仪表是将称重传感器信号&#xff08;或再通过重量变送器&#xff09;转换为重量数字显示&#xff0c;并可对重量数据进行传输、储存、统计、打印的电子设备&#xff0c;常用于工农业生产中的自动化配料&#xff0c;称重&#xff0c;以提高生产效率。随着工业化的发…

TC4056A 1A线性锂离子电池充电器芯片IC

产品描述 TC4056A是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的ESOP8/DIP8封装与较少的外部元件数目使得TC4056A成为便携式应用的理想选择TC4056A可以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构&#xff0c;加…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

Day02-ES集群常见术语,索引管理,文档管理,IK分词器,数据类型映射及kibana环境安装

Day02-ES集群常见术语&#xff0c;索引管理&#xff0c;文档管理&#xff0c;IK分词器&#xff0c;数据类型映射及kibana环境安装 1、昨日内容回顾2、今日内容预告3、ES的常见术语4、索引管理4.1 查看索引4.2 创建索引4.3 修改索引4.4 删除索引4.5 索引别名4.6 关闭索引4.7 打开…

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

FakeNewsGPT4: Advancing Multimodal Fake News Detection through Knowledge-Augmented LVLMs 1.概述 当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性的检测器。然而,现有假新闻检测器因特定领域内的训练方式,难以有效获取开放世…

<数据集>Udacity交通目标识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13239张&#xff08;实际有15000张&#xff0c;但其中1761张无标签的图片被我去除掉&#xff09; 标注数量(xml文件个数)&#xff1a;13239 标注数量(txt文件个数)&#xff1a;13239 标注类别数&#xff1a;11 标注…

护网--1

实验要求&#xff1a; 实现过程&#xff1a; &#xff08;一&#xff09;配置防火墙接口&#xff1a; 在防火墙上创建两个子接口&#xff1a;1/0/1.1 1/0/1.2 在浏览器上用视图界面配置接口&#xff1a; 到服务器&#xff1a; 到生产区&#xff1a; 到办公区&#xff1a; 到…

离线下载linux mysql和mysql基本库

下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 选择数据库版本&#xff0c;系统&#xff0c;系统版本信息 下载需要的rpm包&#xff0c;传入服务器&#xff0c;使用yum install xxx.rpm安装即可 mysql-community下载地址 https://dev.mysql.com/downloads/my…

专业无线麦克风品牌排行榜,无线麦克风哪个品牌音质最好

在数字化的浪潮中&#xff0c;个人创作与表达的舞台日益宽广。无论是专业的影像工匠、热情四溢的播客主播&#xff0c;亦或是生活点滴的记录者——Vlogger&#xff0c;一套卓越的音频装备是确保声音纯净、无瑕传递给观众的基石。无线领夹麦克风凭借其携带方便、操作简便以及卓越…

ai写作软件哪个好?亲测好用的5款工具分享

一眨眼&#xff0c;初伏就要到来了~办公室内的高温仿佛连空气都凝固了&#xff0c;键盘敲击声似乎都变得沉重而迟缓。在这样的天气下&#xff0c;创意与灵感似乎也躲进了阴凉处&#xff0c;办公效率显然大打折扣。 幸运的是&#xff0c;被我找到了新的应对之策&#xff0c;那便…

FastAPI 学习之路(四十七)WebSockets(三)登录后才可以聊天

之前我们是通过前端自动生成的token信息&#xff0c;这次我们通过注册登录&#xff0c;保存到本地去实现。首先&#xff0c;我们实现一个登录页面&#xff0c;放在templates目录下。 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

PHP单商户微店b2c商城微信小程序系统源码

打造专属线上购物空间&#x1f6cd;️ &#x1f680;【开篇&#xff1a;解锁新零售时代新风尚】&#x1f680; 在这个数字化飞速发展的时代&#xff0c;线上购物已成为我们日常生活不可或缺的一部分。对于单商户而言&#xff0c;拥有一个专属的B2C商城微信小程序&#xff0c;…

非堆成加密SM2算法java实现

基于SM2算法的Java示例代码&#xff0c;展示了如何进行公钥加密、私钥解密、私钥签名和公钥验签。 非堆成加密公私钥使用学习请查看&#xff1a;非堆成加密公私钥使用-CSDN博客 RSA算法&#xff1a;非堆成加密RSA算法java实现-CSDN博客 代码示例 展示了以下步骤&#xff1a…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行&#xff0c;可能是因为DNS不稳定吧&#xff0c;因为yum安装时会从三个”repo源“&#xff08;base&#xff0c;extras&#xff0c;updates&#xff09;随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时&#xff0c;比…

如何高效去除论文中的AI痕迹?AI助手在此,为你指点迷津

试试这四款AI论文工具和降重技术&#xff01; 在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息&#xff0c;还帮助我们…

C++心决之stl中那些你不知道的秘密(string篇)

目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的操作 3.vs和g下string结构的说明 3. string类的模拟实现 3.2 浅拷贝 3.3 深拷贝 3.4 写…

基于springboot的鲜花管理系统

系统文档需要联系&#xff0c;白嫖勿扰

程序员的自我约束炼成记

自我约束&#xff0c;是一个人能否走向成功的关键&#xff0c;不知道你是否同意&#xff1f;搞编程10几年了&#xff0c;从来不觉得有什么了不起的&#xff0c;但可以不断自我更新&#xff0c;学习新技术&#xff0c;自我约束力起了很大的作用&#xff0c;对我而言&#xff0c;…

“南征北战”| 卓翼飞思技术领航,助力人工智能大赛上海赛区选拔赛圆满落幕

卓翼飞思继6月支持辽宁赛区选拔赛圆满收官后&#xff0c;近日再次技术助力&#xff0c;为上海赛区的比赛画上圆满句号。值得一提的是&#xff0c;在此次比赛中来自上海工程技术大学、同济大学、上海商学院、上海农林职业技术学院&#xff0c;使用卓翼飞思设备的5支参赛队伍&…