基于java的负载均衡算法解析及源码分享

负载:就是后端系统的承载能力。比如同等条件下,一个1核cpu-1g内存的机器的承载能力一般会比8核cpu-8g内存的机器要差;相同配置下,一个cpu利用率为80%的机器比30%的承载能力一般要差等等。
均衡:保证后端请求的平衡。比如:在同等情况下,分配到多台机器的请求要相当;有些情况下,同一用户尽可能分配到同一台机器等等。
负载均衡的算法实际上就是解决跨系统调用的时候,在考虑后端机器承载情况的前提下,保证请求分配的平衡和合理。下面是基于java的负载均衡算法解析及源码,以供参考。
1、轮询: package class2.zookeeper.loadbalance;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import java.util.set;
/**
* 负载均衡算法,轮询法
* @author guoy
*
*/
public class testroundrobin {
static map《string,integer》 serverweigthmap = new hashmap《string,integer》();
static{
serverweigthmap.put(“192.168.1.12”, 1);
serverweigthmap.put(“192.168.1.13”, 1);
serverweigthmap.put(“192.168.1.14”, 2);
serverweigthmap.put(“192.168.1.15”, 2);
serverweigthmap.put(“192.168.1.16”, 3);
serverweigthmap.put(“192.168.1.17”, 3);
serverweigthmap.put(“192.168.1.18”, 1);
serverweigthmap.put(“192.168.1.19”, 2);
}
integer pos = 0;
public string roundrobin()
{
//重新建立一个map,避免出现由于服务器上线和下线导致的并发问题
map《string,integer》 servermap = new hashmap《string,integer》();
servermap.putall(serverweigthmap);
//获取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;
}
public static void main(string[] args) {
testroundrobin robin = new testroundrobin();
for (int i = 0; i 《 20; i++) {
string serverip = robin.roundrobin();
system.out.println(serverip);
}
}
}
2、加权轮询: package class2.zookeeper.loadbalance;
import java.util.arraylist;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;
import java.util.random;
import java.util.set;
/**
* 加权随机载均衡算法
* @author guoy
*
*/
public class testweightrandom {
static map《string,integer》 serverweigthmap = new hashmap《string,integer》();
static{
serverweigthmap.put(“192.168.1.12”, 1);
serverweigthmap.put(“192.168.1.13”, 1);
serverweigthmap.put(“192.168.1.14”, 2);
serverweigthmap.put(“192.168.1.15”, 2);
serverweigthmap.put(“192.168.1.16”, 3);
serverweigthmap.put(“192.168.1.17”, 3);
serverweigthmap.put(“192.168.1.18”, 1);
serverweigthmap.put(“192.168.1.19”, 2);
}
public static string weightrandom()
{
//重新建立一个map,避免出现由于服务器上线和下线导致的并发问题
map《string,integer》 servermap = new hashmap《string,integer》();
servermap.putall(serverweigthmap);
//获取ip列表list
set《string》 keyset = servermap.keyset();
iterator《string》 it = keyset.iterator();
list《string》 serverlist = new arraylist《string》();
while (it.hasnext()) {
string server = it.next();
integer weight = servermap.get(server);
for (int i = 0; i 《 weight; i++) {
serverlist.add(server);
}
}
random random = new random();
int randompos = random.nextint(serverlist.size());
string server = serverlist.get(randompos);
return server;
}
public static void main(string[] args) {
string serverip = weightrandom();
system.out.println(serverip);
}
}
3、随机: package class2.zookeeper.loadbalance;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import java.util.random;
import java.util.set;
/**
* 随机负载均衡算法
* @author guoy
*
*/
public class testrandom {
static map《string,integer》 serverweigthmap = new hashmap《string,integer》();
static{
serverweigthmap.put(“192.168.1.12”, 1);
serverweigthmap.put(“192.168.1.13”, 1);
serverweigthmap.put(“192.168.1.14”, 2);
serverweigthmap.put(“192.168.1.15”, 2);
serverweigthmap.put(“192.168.1.16”, 3);
serverweigthmap.put(“192.168.1.17”, 3);
serverweigthmap.put(“192.168.1.18”, 1);
serverweigthmap.put(“192.168.1.19”, 2);
}
public static string random()
{
//重新建立一个map,避免出现由于服务器上线和下线导致的并发问题
map《string,integer》 servermap = new hashmap《string,integer》();
servermap.putall(serverweigthmap);
//获取ip列表list
set《string》 keyset = servermap.keyset();
arraylist《string》 keylist = new arraylist《string》();
keylist.addall(keyset);
random random = new random();
int randompos = random.nextint(keylist.size());
string server = keylist.get(randompos);
return server;
}
public static void main(string[] args) {
string serverip = random();
system.out.println(serverip);
}
}
4、加权随机: package class2.zookeeper.loadbalance;
import java.util.arraylist;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;
import java.util.random;
import java.util.set;
/**
* 加权随机载均衡算法
* @author guoy
*
*/
public class testweightrandom {
static map《string,integer》 serverweigthmap = new hashmap《string,integer》();
static{
serverweigthmap.put(“192.168.1.12”, 1);
serverweigthmap.put(“192.168.1.13”, 1);
serverweigthmap.put(“192.168.1.14”, 2);
serverweigthmap.put(“192.168.1.15”, 2);
serverweigthmap.put(“192.168.1.16”, 3);
serverweigthmap.put(“192.168.1.17”, 3);
serverweigthmap.put(“192.168.1.18”, 1);
serverweigthmap.put(“192.168.1.19”, 2);
}
public static string weightrandom()
{
//重新建立一个map,避免出现由于服务器上线和下线导致的并发问题
map《string,integer》 servermap = new hashmap《string,integer》();
servermap.putall(serverweigthmap);
//获取ip列表list
set《string》 keyset = servermap.keyset();
iterator《string》 it = keyset.iterator();
list《string》 serverlist = new arraylist《string》();
while (it.hasnext()) {
string server = it.next();
integer weight = servermap.get(server);
for (int i = 0; i 《 weight; i++) {
serverlist.add(server);
}
}
random random = new random();
int randompos = random.nextint(serverlist.size());
string server = serverlist.get(randompos);
return server;
}
public static void main(string[] args) {
string serverip = weightrandom();
system.out.println(serverip);
}
}
5、ip hash: package class2.zookeeper.loadbalance;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import java.util.set;
/**
* 负载均衡 ip_hash算法
* @author guoy
*
*/
public class testiphash {
static map《string,integer》 serverweigthmap = new hashmap《string,integer》();
static{
serverweigthmap.put(“192.168.1.12”, 1);
serverweigthmap.put(“192.168.1.13”, 1);
serverweigthmap.put(“192.168.1.14”, 2);
serverweigthmap.put(“192.168.1.15”, 2);
serverweigthmap.put(“192.168.1.16”, 3);
serverweigthmap.put(“192.168.1.17”, 3);
serverweigthmap.put(“192.168.1.18”, 1);
serverweigthmap.put(“192.168.1.19”, 2);
}
/**
* 获取请求服务器地址
* @param remoteip 负载均衡服务器ip
* @return
*/
public static string iphash(string remoteip)
{
//重新建立一个map,避免出现由于服务器上线和下线导致的并发问题
map《string,integer》 servermap = new hashmap《string,integer》();
servermap.putall(serverweigthmap);
//获取ip列表list
set《string》 keyset = servermap.keyset();
arraylist《string》 keylist = new arraylist《string》();
keylist.addall(keyset);
int hashcode =remoteip.hashcode();
int serverlistsize = keylist.size();
int serverpos = hashcode % serverlistsize;
return keylist.get(serverpos);
}
public static void main(string[] args) {
string serverip = iphash(“192.168.1.12”);
system.out.println(serverip);
}
}

工业机器人的视觉市场未来该如何发展
三星S8获评智能机第一好屏:iPhone 7不服反击
应用芯片设计的人工智能解决方案有何优势?
采用LED调光的FET电路设计与波形分析
配备再充电系统的太阳能供电系统的介绍
基于java的负载均衡算法解析及源码分享
海尔红外防干烧技术实现了燃气灶自测温度
PLC标准和编程语言标准的关键发展历程
OPPO首款智能电视R1深度评测
明年 1 月 23 日起,香港铁路AlipayHK 和支付宝均可扫码进闸
Cloud VR业务应用场景丰富 与未来息息相关
听说上了中国制裁名单,美国企业“求生欲”满满
氢燃料电池商业化进程正在加速
新能源电机开关磁阻电机原理的介绍
DS2740高精度库仑计参考设计-DS2740 High-P
荣威rx5新车型正式上市,售价为15.88万元,荣威RX5, 20T自动互联网智尊版
Galaxy S21显示屏下指纹识别速度快了一倍,面积将增大 77%
我们需要一个怎样的科技时代?
美企研发了全世界最大的计算机芯片,比普通的iPad略大
安全是物联网应用的基础,青莲云物联网发布会共建物联网安全生态