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;@Controllerpublic 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(); } }}
多线程输出结果
t0t1t2t3t4t5t6server:127.0.0.4,pos=0server:127.0.0.3,pos=1server:127.0.0.2,pos=2server:127.0.0.2,pos=2t7server:127.0.0.4,pos=0server:127.0.0.3,pos=1t8server:127.0.0.2,pos=2server:127.0.0.2,pos=2t9server:127.0.0.4,pos=0t10server:127.0.0.3,pos=1server:127.0.0.2,pos=2
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章: