Java实现5种负载均衡算法

1. 轮询算法
import com.google.common.collect.Lists;import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;/*** 轮询算法* 轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。* 优点:绝对公平* 缺点:无法根据服务器性能去分配,无法合理利用服务器资源。* @author: * @date: 2022-11-10 17:53*/
public class Round<T> {private AtomicInteger index = new AtomicInteger(0);public <T> T roundRobin(List<T> data) {T t ;if (index.get() >= data.size()) {index = new AtomicInteger(0);}t = data.get(index.get());//轮询+1index.getAndIncrement();return t;}public static void main(String[] args) {List<String> ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");Round<String> testRoundRobin =new Round<String>();for (int i=0;i< 10 ;i++){String s = testRoundRobin.roundRobin(ips);System.out.println(s);}}
}
2. 加权轮询法
import com.collmall.shortlink.entity.DbConfig;
import org.springframework.util.CollectionUtils;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;/*** 加权轮询法* 该算法中,每个机器接受的连接数量是按权重比例分配的。这是对普通轮询算法的改进,* 比如你可以设定:第三台机器的处理能力是第一台机器的两倍,那么负载均衡器会把两倍的连接数量分配给第3台机器,轮询可以将请求顺序按照权重分配到后端。* @author * @date 2022年11月11日14:46:25*/
public class Weight<T> {private AtomicInteger index = new AtomicInteger(0);public List<T> getDataByWeight(List<T> data) throws NoSuchFieldException, IllegalAccessException {List<T> ips = new CopyOnWriteArrayList<T>();if (CollectionUtils.isEmpty(data)) {return data;}for (T t : data) {Field nameField = t.getClass().getDeclaredField("name");// setAccessible 实体中的属性是用private定义的,需要设置setAccessible 为true,才可以访问到对象nameField.setAccessible(true);// 获取属性值String name  =(String) nameField.get(t);Field weightField = t.getClass().getDeclaredField("weight");// setAccessible 实体中的属性是用private定义的,需要设置setAccessible 为true,才可以访问到对象weightField.setAccessible(true);// 获取属性值Integer weight = (Integer) weightField.get(t);for (int ipCount =0; ipCount < weight; ipCount++) {ips.add(t);}}return ips;}public  T weightRobin(List<T> data) throws NoSuchFieldException, IllegalAccessException {List<T> list = this.getDataByWeight(data);if (index.get() >= list.size()){index = new AtomicInteger(0);}T t = list.get(index.get());index.getAndIncrement();return  t;}public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {Weight testWeightRobin=new Weight();List<DbConfig> dbConfigList= new ArrayList<>();dbConfigList.add(new DbConfig("192.168.1.1", 1));dbConfigList.add(new DbConfig("192.168.1.2", 2));dbConfigList.add(new DbConfig("192.168.1.3", 4));for (int i =0;i< 10 ;i++){DbConfig server = (DbConfig)testWeightRobin.weightRobin(dbConfigList);System.out.println(server);}}
}
3. 加权随机法
import com.collmall.shortlink.entity.DbConfig;import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ThreadLocalRandom;/*** 加权随机法* 获取带有权重的随机数字,随机这种东西,不能看绝对,只能看相对,* 我们不用index 控制下标进行轮询,只用random 进行随机取ip,即实现算法。* @author * @date 2022年11月14日11:37:20*/
public class RandomWeight<T> {public <T> List<T> getDataByWeight(List<T> data) throws NoSuchFieldException, IllegalAccessException {List<T> ips = new CopyOnWriteArrayList<T>();for (T t : data) {Field nameField = t.getClass().getDeclaredField("name");// setAccessible 实体中的属性是用private定义的,需要设置setAccessible 为true,才可以访问到对象nameField.setAccessible(true);// 获取属性值String name  =(String) nameField.get(t);Field weightField = t.getClass().getDeclaredField("weight");// setAccessible 实体中的属性是用private定义的,需要设置setAccessible 为true,才可以访问到对象weightField.setAccessible(true);// 获取属性值Integer weight = (Integer) weightField.get(t);// 根据权重不同,放入list 中的数量等同于权重,轮询出的的次数等同于权重for (int ipCount =0; ipCount < weight; ipCount++) {ips.add(t);}}return ips;}public <T> T randomWeightRobin(List<T> data) throws NoSuchFieldException, IllegalAccessException {List<T> ips = this.getDataByWeight(data);
//        //循环随机数
//        Random random=new Random();
//        int index =random.nextInt();int index = ThreadLocalRandom.current().nextInt(ips.size());T t = ips.get(index);return  t;}public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {RandomWeight<DbConfig> randomWeightRobin =new RandomWeight<DbConfig>();List<DbConfig> dbConfigList= new ArrayList<>();dbConfigList.add(new DbConfig("192.168.1.1", 1));dbConfigList.add(new DbConfig("192.168.1.2", 2));dbConfigList.add(new DbConfig("192.168.1.3", 4));for (int i =0;i< 10 ;i++){DbConfig server = randomWeightRobin.randomWeightRobin(dbConfigList);System.out.println(server);}}
}
4. 随机法
import com.collmall.shortlink.entity.DbConfig;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;/*** 随机法* 负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,* 这种实现算法最简单,随之调用次数增大,这种算法可以达到每台服务器的请求量接近于平均。* @author * @date  2022年11月14日13:46:24*/
public class Random<T> {public <T> T randomRobin(List<T> data){int index = ThreadLocalRandom.current().nextInt(data.size());T t = data.get(index);return  t;}public static void main(String[] args) {Random<DbConfig> randomdRobin =new Random<DbConfig>();List<DbConfig> dbConfigList= new ArrayList<>();dbConfigList.add(new DbConfig("192.168.1.1", 1));dbConfigList.add(new DbConfig("192.168.1.2", 2));dbConfigList.add(new DbConfig("192.168.1.3", 4));for (int i=0;i< 10 ;i++){DbConfig dbConfig = randomdRobin.randomRobin(dbConfigList);System.out.println(dbConfig);}}
}
5. IP_Hash 法
import com.collmall.shortlink.entity.DbConfig;import java.util.ArrayList;
import java.util.List;/*** IP_Hash算法* hash(ip)%N算法,通过一种散列算法把客户端来源IP根据散列取模算法将请求分配到不同的服务器上** 优点:保证了相同客户端IP地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的session会话** 缺点: 如果服务器进行了下线操作,源IP路由的服务器IP就会变成另外一台,如果服务器没有做session 共享话,会造成session丢失。* @author * @date 2022年11月14日14:06:41*/
public class IpHash<T> {/**** @param data* @param hashData* @param <T>* @return*/public <T> T ipHashRobin(List<T> data,String hashData) {//        int hashCode = hashData.hashCode();
//        int listSize = data.size();
//        int index = hashCode % listSize;int index = hashData.hashCode() % data.size();T t = data.get(index);return  t;}public static void main(String[] args) {IpHash<DbConfig> ipHash =new IpHash<DbConfig>();List<DbConfig> dbConfigList= new ArrayList<>();dbConfigList.add(new DbConfig("192.168.1.1", 1));dbConfigList.add(new DbConfig("192.168.1.2", 2));dbConfigList.add(new DbConfig("192.168.1.3", 4));DbConfig dbConfig = ipHash.ipHashRobin(dbConfigList, "192.168.88.2");System.out.println(dbConfig.toString());}
}
6. 附录 DbConfig
public class DbConfig  {//idprivate Long id;//数据库名称private String name;//负载策略:1轮询算法 ,2 加权轮询法,3 加权随机法,4 随机法,5 IP_Hash算法private Integer loadPolicy;//权重: 只有 2 加权轮询法,3 加权随机法 才会用到private Integer weight;//是否删除:0 未删除,1是已删除private Integer isDeleted;//创建时间private Date cT;//更新时间private Date uT;public DbConfig(String name, Integer weight) {this.name = name;this.weight = weight;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getLoadPolicy() {return loadPolicy;}public void setLoadPolicy(Integer loadPolicy) {this.loadPolicy = loadPolicy;}public Integer getWeight() {return weight;}public void setWeight(Integer weight) {this.weight = weight;}public Integer getIsDeleted() {return isDeleted;}public void setIsDeleted(Integer isDeleted) {this.isDeleted = isDeleted;}public Date getCT() {return cT;}public void setCT(Date cT) {this.cT = cT;}public Date getUT() {return uT;}public void setUT(Date uT) {this.uT = uT;}/*** 获取主键值** @return 主键值*/@Overrideprotected Serializable pkVal() {return this.id;}@Overridepublic String toString() {return "DbConfig{" +"id=" + id +", name='" + name + '\'' +", loadPolicy=" + loadPolicy +", weight=" + weight +", isDeleted=" + isDeleted +", cT=" + cT +", uT=" + uT +'}';}
}

参考:

Java实现5种负载均衡算法(小结)_java_脚本之家 (jb51.net)

Java实现5种负载均衡算法相关推荐

  1. Dubbo内置4种负载均衡算法(详解)

    1.1 什么是负载均衡 在实际开发中,一个服务基本都是集群模式的,也就是多个功能相同的项目在运行,这样才能承受更高的并发,这时一个请求到这个服务,就需要确定访问哪一个服务器 Dubbo框架内部支持负载 ...

  2. 五分钟让你搞懂Nginx负载均衡原理及四种负载均衡算法

    前言 今天这篇文章介绍了负载均衡的原理以及对应的四种负载均衡算法,当然还有对应的指令及实战,欢迎品尝.有不同意见的朋友可以评论区留言! 负载均衡 所谓负载均衡,就是 Nginx 把请求均匀的分摊给上游 ...

  3. 微服务的几种负载均衡算法

    目录 一.负载均衡 二.负载均衡算法 1.静态负载均衡 2.动态负载均衡 三.Dubbo负载均衡的四种算法 1.基于权重随机算法RandomLoadBalance 2.基于最少活跃数算法LeastAc ...

  4. ribbon的7种负载均衡算法和替换方法

    一,ribbon核心组件IRule自带的7中负载均衡算法 1,轮询 com.netflix.loadbalancer.RoundRobinRule 2,随机 com.netflix.loadbalan ...

  5. 常见的几种负载均衡算法

    1.轮询 将所有请求,依次分发到每台服务器上,适合服务器硬件相同的场景. 优点:服务器请求数目相同: 缺点:服务器压力不一样,不适合服务器配置不同的情况: 2.随机 请求随机分配到各台服务器上. 优点 ...

  6. 5种Dubbo负载均衡算法(看这一篇就够了)

    文章目录 1.概述 2.随机+权重(random) 3.轮询+权重(roundrobin) 4.最少连接(leastactive) 5.最短响应(shortestresponse) 6.一致性哈希(c ...

  7. 详解【负载均衡】(负载均衡算法、一致性hash、负载均衡架构分析)

    作者:duktig 博客:https://duktig.cn 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本文源码参看:https://github.com/duktig666/distribute ...

  8. 经过负载均衡图片加载不出来_吐血输出:2万字长文带你细细盘点五种负载均衡策略。...

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  9. 吐血输出:2万字长文带你细细盘点五种负载均衡策略。

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

最新文章

  1. javascript焦点图(根据图片下方的小框自动播放)
  2. 支持后悔药的etcdui
  3. 通过Oracle VM Manager管理配置虚拟机
  4. GitHub 官方终于出 App 了!iPhone 用户可抢先体验
  5. 2、单机运行环境搭建之 --CentOS-6.5安装配置Tomcat8
  6. MySql存储过程语法及事例
  7. 一个想法照进现实-《IT连》创业项目:三天的风投对接活动内幕分享
  8. dede新增字段调用方法
  9. 搭建私有云盘 cloudreve
  10. 冒泡排序Java代码实现
  11. Minecraft 我的世界 .minecraft下的各个文件夹的用处
  12. php木马伪装成图片,木马伪装图片运行的技巧
  13. 第4章 需求分析和model设计
  14. 双机(51单片机)串行通信最基本的方法
  15. KPM字符串匹配next矩阵计算
  16. 易语言c源码流程图怎么实现,易语言APC内存注入主要流程源码
  17. 敢不敢挑战,半年学好英语。
  18. 嵌入式linux开发板使用pulseaudio连接蓝牙耳机播放音频文件
  19. 用条件编译方法实现以下功能:输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一个字母。用define命令控制
  20. uniapp页面适配平板和手机

热门文章

  1. 计算机网络 ---课后总结
  2. 网际快车FlashGet1.65
  3. 实战捕获局域网ARP病毒
  4. 在DreamSpark上从Microsoft获得免费的学生软件
  5. 汽车基础软件赛道正在经历一轮洗牌
  6. 一道好玩的逻辑推理题(和真话及假话相关)
  7. e.keyCode和e.which使用
  8. Linux下手动查杀木马过程
  9. 全国各省市区数据sql格式(utf8)
  10. 八大常用电子元器件,你知道多少?今天给大家讲个透彻,让你明白