/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:33:15</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:Hash
* @Description: <p> Hash</p>
* @Author: - Jason
* @CreatTime:2018年5月16日 下午8:38:29
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class Hash { public static String getServer(){
// 重建一个Map,避免服务器的上下线导致的并发问题
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// 取得Ip地址List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
// 在Web应用中可通过HttpServlet的getRemoteIp方法获取
String remoteIp = "127.0.0.1";
int hashCode = remoteIp.hashCode();
int serverListSize = keyList.size();
int serverPos = hashCode % serverListSize;
return keyList.get(serverPos);
} /**
* @Description: Just for Test
* @param args void
* @Autor: Jason - Jasonandy@hotmail.com
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}

  

/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:00:17</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance; import java.util.HashMap; /**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:IpMap
* @Description: <p> IpMap
* https://www.cnblogs.com/szlbm/p/5588555.html
* </p>
* @Author: - Jason
* @CreatTime:2018年5月16日 下午8:00:17
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class IpMap { // 待路由的Ip列表,Key代表Ip,Value代表该Ip的权重
public static HashMap<String, Integer> serverWeightMap = new HashMap<String, Integer>(); static{
serverWeightMap.put("192.168.1.100", 1);
serverWeightMap.put("192.168.1.101", 1);
// 权重为4
serverWeightMap.put("192.168.1.102", 4);
serverWeightMap.put("192.168.1.103", 1);
serverWeightMap.put("192.168.1.104", 1);
// 权重为3
serverWeightMap.put("192.168.1.105", 3);
serverWeightMap.put("192.168.1.106", 1);
// 权重为2
serverWeightMap.put("192.168.1.107", 2);
serverWeightMap.put("192.168.1.108", 1);
serverWeightMap.put("192.168.1.109", 1);
serverWeightMap.put("192.168.1.110", 1);
} }
/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:33:15</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:Random
* @Description: <p> Random
*
* 基于概率统计的理论,吞吐量越大,随机算法的效果越接近于轮询算法的效果
* </p>
* @Author: - 随机算法
* @CreatTime:2018年5月16日 下午8:36:48
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class Random { public static String getServer(){
// 重建一个Map,避免服务器的上下线导致的并发问题
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// 取得Ip地址List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
java.util.Random random = new java.util.Random();//获取随机数
int randomPos = random.nextInt(keyList.size());
return keyList.get(randomPos);
} /**
* @Description: Just for Test
* @param args void
* @Autor: Jason - Jasonandy@hotmail.com
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:33:15</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:RoundRobin
* @Description: <p> 轮询算法
* https://www.cnblogs.com/szlbm/p/5588555.html
* </p>
* @Author: - Jason
* @CreatTime:2018年5月16日 下午8:33:15
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class RoundRobin { private static Integer pos = 0; public static String getServer(){
// 重建一个Map,避免服务器的上下线导致的并发问题
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// 取得Ip地址List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
String server = null;
synchronized (pos){
if (pos > keySet.size())
pos = 0;
server = keyList.get(pos);
pos ++;
}
return server;
} /**
* @Description: Just for Test
* @param args void
* @Autor: Jason - Jasonandy@hotmail.com
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:33:15</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set; /**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:WeightRandom
* @Description: <p> WeightRandom </p>
* @Author: -
* @CreatTime:2018年5月16日 下午8:41:24
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class WeightRandom { public static String getServer(){
// 重建一个Map,避免服务器的上下线导致的并发问题
Map<String, Integer> serverMap =
new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap); // 取得Ip地址List
Set<String> keySet = serverMap.keySet();
Iterator<String> iterator = keySet.iterator(); List<String> serverList = new ArrayList<String>();
while (iterator.hasNext()){
String server = iterator.next();
int weight = serverMap.get(server);
for (int i = 0; i < weight; i++)
serverList.add(server);
} java.util.Random random = new java.util.Random();
int randomPos = random.nextInt(serverList.size()); return serverList.get(randomPos);
} /**
* @Description: Just for Test
* @param args void
* @Autor: Jason - Jasonandy@hotmail.com
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:33:15</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set; /**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:WeightRoundRobin
* @Description: <p> WeightRoundRobin </p>
* @Author: - Jason
* @CreatTime:2018年5月16日 下午8:39:44
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class WeightRoundRobin { private static Integer pos; public static String getServer(){ // 重建一个Map,避免服务器的上下线导致的并发问题
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap); // 取得Ip地址List
Set<String> keySet = serverMap.keySet();
Iterator<String> iterator = keySet.iterator(); List<String> serverList = new ArrayList<String>();
while (iterator.hasNext())
{
String server = iterator.next();
int weight = serverMap.get(server);
for (int i = 0; i < weight; i++)
serverList.add(server);
} String server = null;
synchronized (pos){
if (pos > keySet.size())
pos = 0;
server = serverList.get(pos);
pos ++;
}
return server;
} /**
* @Description: Just for Test
* @param args void
* @Autor: Jason - Jasonandy@hotmail.com
*/
public static void main(String[] args) {
//for (int i = 0; i < 10; i++) {
System.out.println(getServer());
//}
} }

loadbalance轮询算法 java实现的更多相关文章

  1. Java实现平滑加权轮询算法--降权和提权

    上一篇讲了普通轮询.加权轮询的两种实现方式,重点讲了平滑加权轮询算法,并在文末留下了悬念:节点出现分配失败时降低有效权重值:成功时提高有效权重值(但不能大于weight值). 本文在平滑加权轮询算法的 ...

  2. 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法, 随机轮询, 加权随机轮询, 最小活跃数算法(基于dubbo) java代码实现

    直接上干活 /** * @version 1.0.0 * @@menu <p> * @date 2020/11/17 16:28 */ public class LoadBlance { ...

  3. SpringCloud-Ribbon负载均衡机制、手写轮询算法

    Ribbon 内置的负载均衡规则 在 com.netflix.loadbalancer 包下有一个接口 IRule,它可以根据特定的算法从服务列表中选取一个要访问的服务,默认使用的是「轮询机制」 Ro ...

  4. 权重轮询调度算法 java版本号

    权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...

  5. c#-轮询算法

    这两天做东西,业务上有个特殊的需求,在用户访问页面的时候,针对某一行代码进行控制,按照概率来进行显示,我做的是针对当前页面的曝光进行处理,曝光代码是第三方的,页面上只要有这段代码就算是执行了这段曝光代 ...

  6. C# Nginx平滑加权轮询算法

    代码很简单,但算法很经典,话不多说,直接上代码. public struct ServerConfig { /// <summary> /// 初始权重 /// </summary& ...

  7. Java实现负载均衡算法--轮询和加权轮询

    1.普通轮询算法 轮询(Round Robin,RR)是依次将用户的访问请求,按循环顺序分配到web服务节点上,从1开始到最后一台服务器节点结束,然后再开始新一轮的循环.这种算法简单,但是没有考虑到每 ...

  8. 负载均衡算法WeightedRoundRobin(加权轮询)简介及算法实现

    Nginx的负载均衡默认算法是加权轮询算法,本文简单介绍算法的逻辑,并给出算法的Java实现版本. 本文参考了Nginx的负载均衡 - 加权轮询 (Weighted Round Robin).     ...

  9. Dubbo加权轮询负载均衡的源码和Bug,了解一下?

    本文是对于Dubbo负载均衡策略之一的加权随机算法的详细分析.从2.6.4版本聊起,该版本在某些情况下存在着比较严重的性能问题.由问题入手,层层深入,了解该算法在Dubbo中的演变过程,读懂它的前世今 ...

随机推荐

  1. dubbo简单示例

    dubbo简单示例 2019-09-06 1 Zookeeper注册中心的搭建(windows单机) 下载zookeeper压缩包并解压到 D:\zookeeper\apache-zookeeper- ...

  2. NIOBuffer 缓冲区

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但是,Channel,Buffer 和 Select ...

  3. .NETCore websocket

    .NETCore websocket 实现简易.高性能.集群即时通讯组件,支持点对点通讯.群聊通讯.上线下线事件消息等众多实用性功能. https://github.com/2881099/im

  4. Beef搭建并通过Nginx绑定域名

    Beef和Nginx安装过程这里就不再说明了相关链接:Beef官方安装教程 1. 修改Beef的config.yaml配置文件 xss连接地址改成要绑定的域名 sudo vim /beef/confi ...

  5. hive删除空分区

    当hive中分区字段有NULL值时,hive会使用dynamic partition,数据会放到一个特殊的分区,这个分区由参数“hive.exec.default.partition.name”控制, ...

  6. flutter upgrade之后出现Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from

    错误信息 Initializing gradle... Resolving dependencies... Running Gradle task 'assembleDebug'... /Users/ ...

  7. MySQL导数据笔记

    2019-12-16 9:08:43 星期一 MySQL 5.6 limit / order 有bug, 如果主键不是自增的, 只能全表导出导入, 增量导入导出的话会报主键重复 触发器: 批量导入数据 ...

  8. 使用Python解压zip、rar文件

    解压 zip 文件 基本解压操作 import zipfile ''' 基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]]) ...

  9. Linux 提示更新密码

    You are required to change your password immediately (password aged)Last login: Thu Aug 22 17:04:01 ...

  10. java继承实现的基本原理

    方法调用的过程 寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息. 动态绑定,而动态绑定实现的机制就是根据对象的实际类型查找要执行的方法,子类型中找不到的 ...