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

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


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


服务器地址池实现:

package _20170117;

import java.util.HashMap;

/**
 * 服务器地址池
 * Created by zhang on 17/1/17.
 */
public class IpMap {
    public static HashMap serverWeightMap = new HashMap();
    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 serverMap = new HashMap();
        serverMap.putAll(IpMap.serverWeightMap);
        //获取Ip地址List
        Set keySet = serverMap.keySet();
        List keyList = new ArrayList();
        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 serverMap = new HashMap();
        serverMap.putAll(IpMap.serverWeightMap);
        //获取Ip地址List
        Set keySet = serverMap.keySet();
        List keyList = new ArrayList();
        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 serverMap = new HashMap();
        serverMap.putAll(IpMap.serverWeightMap);
        //获取Ip地址List
        Set keySet = serverMap.keySet();
        List keyList = new ArrayList();

        Iterator 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 serverMap = new HashMap();
        serverMap.putAll(IpMap.serverWeightMap);
        //获取Ip地址List
        Set keySet = serverMap.keySet();
        Iterator iterator = keySet.iterator();

        List serverList = new ArrayList();
        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)