首页 > 编程语言 > 详细

负载均衡的几种算法Java实现代码

时间:2019-10-31 12:28:03      阅读:84      评论:0      收藏:0      [点我收藏+]

轮询

技术分享图片
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);
            }
        }
}
技术分享图片

加权轮询

技术分享图片
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);
    }
}
技术分享图片

随机

技术分享图片
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);
    }
}
技术分享图片

加权随机

技术分享图片
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);
    }
}
技术分享图片

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);
    }

}
技术分享图片

负载均衡的几种算法Java实现代码

原文:https://www.cnblogs.com/cangqinglang/p/11770222.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!