zoukankan      html  css  js  c++  java
  • Java加权负载均衡策略

    加权轮询

    后端集群每台机器都分配一个权重,权重高得会承担更多的流量,相反权重低的分配的流量也会少,这种策略允许后端集群机器配置差异化

    java实现

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class IpMapController extends LogBaseController implements Runnable {
       private static Integer pos = 0;
    
       // 待scp的Ip列表,Key代表Ip,Value代表该Ip的权重
       public static HashMap<String, Integer> serverWeightMap = new HashMap<String, Integer>();
    
       static {
       	serverWeightMap.put("127.0.0.1", 1);
       	serverWeightMap.put("127.0.0.2", 1);
       	serverWeightMap.put("127.0.0.3", 1);
       	serverWeightMap.put("127.0.0.4", 1);
       }
    
       public void run() {
       	// 重建一个Map,避免服务器的上下线导致的并发问题
       	Map<String, Integer> serverMap = new HashMap<String, Integer>();
       	serverMap.putAll(serverWeightMap);
    
       	// 取得Ip地址List
       	Set<String> keySet = serverMap.keySet();
       	Iterator<String> iterator = keySet.iterator();
    
       	// 根据权重组成iplist
       	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);
       		System.out.println("server:" + server + ",pos=" + pos);
       		pos++;
       	}
       	
       }
    
       public static void main(String[] args) {
       	 IpMapController ipRunnable = new IpMapController();
    
       	for (int i = 0; i <= 10; i++) {
       		System.out.println("t" + i);
       		new Thread(ipRunnable).start();
       	}
    
       }
    
    }
    
    

    多线程输出结果

    t0
    t1
    t2
    t3
    t4
    t5
    t6
    server:127.0.0.4,pos=0
    server:127.0.0.3,pos=1
    server:127.0.0.2,pos=2
    server:127.0.0.2,pos=2
    t7
    server:127.0.0.4,pos=0
    server:127.0.0.3,pos=1
    t8
    server:127.0.0.2,pos=2
    server:127.0.0.2,pos=2
    t9
    server:127.0.0.4,pos=0
    t10
    server:127.0.0.3,pos=1
    server:127.0.0.2,pos=2
    
    
  • 相关阅读:
    隐藏虚拟网卡
    Eclipse3.2编码选中对象着色
    PHP里的字符串定义小技巧汇总
    【原创】交互型网页防止IP欺骗的技巧
    VS2005的报错让我“二”了一把
    【原创】利用PHP5的__autoload代替繁琐低效的的外部文件包含方式
    关于WebDataWindow.Net的一些开发小细节
    PHP效率损失操作汇总
    动态添加按钮及关联方法(带参数)
    GridView中模版列使用RowCommand事件如何得到当前列的行索引或记录ID
  • 原文地址:https://www.cnblogs.com/wanli002/p/12590969.html
Copyright © 2011-2022 走看看