/**
* <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. 【AtCoder】 ARC 096

    link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...

  2. 论文阅读:Single Image Dehazing via Conditional Generative Adversarial Network

    Single Image Dehazing via Conditional Generative Adversarial Network Runde Li∗ Jinshan Pan∗ Zechao L ...

  3. Python 元编程

    1.为函数添加包装器 总是存在这样的场景,在一个函数执行前后需要做一些操作处理,常见于日志创建.权限认证或者性能分析等.但有一个问题存在,那就是被装饰的函数,其元信息会丢失,函数引用会指向装饰器的返回 ...

  4. transient的

    1,transient的用途及使用方法1,用途 我们知道,当一个对象实现了Serilizable接口,这个对象就可以被序列化,我们不关心其内在的原理,只需要了解这个类实现了Serilizable接口, ...

  5. <每日 1 OJ> -LeetCode 28. 实现 strStr()

    题目: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存 ...

  6. javascript prototype理解

    如图比较好的阐述了prototype和__proto__ 简单的可以这么理解: 狗类A( function foo()),狗类A的模板描述:A.模板 (foo.prototype)是一个对象objec ...

  7. 工具推荐--Mac下画图软件:Omnigraffle

    场景描述: 日常工作中,开发的小伙伴可能会遇到,需要画流程图,架构图,时序图,UML图,网络拓扑图...等等各种图,有的小伙伴用Visio,ProcessOn,亿图图示......又是一堆软件,先不说 ...

  8. Create table as select

    create table xxx as select create table table1 =; 根据table2的表结构,创建tables1 create table table1 as sele ...

  9. Mac JDK 卸载方法

    卸载步骤 输入 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -fr /Library/Prefere ...

  10. DSCP 标

    DSCP差分服务代码点(Differentiated Services Code Point).它在每个数据包IP头部的服务类别TOS标识字节中,利用已使用的6比特和未使用的2比特,通过编码值来区分优 ...