loadbalance轮询算法 java实现

/**
 * <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());
        //}
    }
    

}

 

posted @ 2018-10-19 16:50  安以北往南  阅读(1486)  评论(0编辑  收藏  举报