您的位置:首页 > 编程语言 > Java开发

Java实现常用简单负载均衡(LoadBalance)

2017-01-18 00:19 567 查看
我们先说一下百度百科对于 负载均衡 的定义:

建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器FTP服务器企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

话不多说,接下来,我们通过Java代码,来实现几种非常简单的负载均衡:

服务器地址池实现:

package _20170117;

import java.util.HashMap;

/**
* 服务器地址池
* Created by zhang on 17/1/17.
*/
public class IpMap {
public static HashMap<String, Integer> serverWeightMap = new HashMap<String, Integer>();
static {
serverWeightMap.put("192.168.30.201", 1);
serverWeightMap.put("192.168.30.112", 2);
serverWeightMap.put("192.168.30.124", 3);
serverWeightMap.put("192.168.30.223", 4);
serverWeightMap.put("192.168.30.110", 2);
serverWeightMap.put("192.168.30.118", 1);
serverWeightMap.put("192.168.30.200", 5);
}
}


轮询法:

package _20170117;

import java.util.*;

/**
* 轮询法
* Created by zhang on 17/1/17.
*/
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();
List<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
String server;
synchronized (pos){
if (pos >= keySet.size()) {
pos = 0;
}
server = keyList.get(pos);
pos ++ ;
}
return server;
}
}


随机法:

package _20170117;

import java.util.*;

/**
* 随机法
* Created by zhang on 17/1/17.
*/
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();
List<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
java.util.Random random = new java.util.Random();
int pos = random.nextInt(keyList.size());

return keyList.get(pos);
}
}


加权随机法:

package _20170117;

import java.util.*;
import java.util.Random;

/**
* 加权随机
* Created by zhang on 17/1/17.
*/
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();
List<String> keyList = new ArrayList<String>();

Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String server = iterator.next();
int weight = serverMap.get(server);
for (int i = 0; i < weight; i++) {
keyList.add(server);
}
}
Random random = new Random();
int pos = random.nextInt(keyList.size());

return keyList.get(pos);
}
}


加权轮询法:

package _20170117;

import java.util.*;

/**
* 加权轮询法
* Created by zhang on 17/1/17.
*/
public class WeightRoundRobin {
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();
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 ;
synchronized (pos){
if (pos >= serverList.size()) {
pos = 0;
}
server = serverList.get(pos);
pos ++ ;
}
return server;
}

}

以上几种方式的实现都非常简单,只是为了让大家对于负载均衡有一个更加深刻的了解,只是提供给大家一个思路,在真正的实现过程中要比上面难很多,考虑的点也要多很多,希望在这里能让大家收获一些东西
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 负载均衡