Java加權(quán)負(fù)載均衡策略實(shí)現(xiàn)過程解析
加權(quán)輪詢
后端集群每臺(tái)機(jī)器都分配一個(gè)權(quán)重,權(quán)重高得會(huì)承擔(dān)更多的流量,相反權(quán)重低的分配的流量也會(huì)少,這種策略允許后端集群機(jī)器配置差異化
java實(shí)現(xiàn)
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的權(quán)重 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() { // 重建一個(gè)Map,避免服務(wù)器的上下線導(dǎo)致的并發(fā)問題 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(serverWeightMap); // 取得Ip地址List Set<String> keySet = serverMap.keySet(); Iterator<String> iterator = keySet.iterator(); // 根據(jù)權(quán)重組成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(); } }}
多線程輸出結(jié)果
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
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. SpringBoot使用Captcha生成驗(yàn)證碼2. android studio實(shí)現(xiàn)簡單的計(jì)算器(無bug)3. JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis4. Python 忽略文件名編碼的方法5. android 控件同時(shí)監(jiān)聽單擊和雙擊實(shí)例6. Java Media Framework 基礎(chǔ)教程7. springboot項(xiàng)目整合druid數(shù)據(jù)庫連接池的實(shí)現(xiàn)8. 解決vue頁面刷新,數(shù)據(jù)丟失的問題9. python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作10. python logging.info在終端沒輸出的解決
