Java加權(quán)負(fù)載均衡策略實(shí)現(xiàn)過(guò)程解析
加權(quán)輪詢(xú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ā)問(wèn)題 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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 詳解Android studio 動(dòng)態(tài)fragment的用法2. Android如何加載Base64編碼格式圖片3. 解決Android studio xml界面無(wú)法預(yù)覽問(wèn)題4. 圖文詳解vue中proto文件的函數(shù)調(diào)用5. 什么是python的自省6. Spring Boot和Thymeleaf整合結(jié)合JPA實(shí)現(xiàn)分頁(yè)效果(實(shí)例代碼)7. Vuex localStorage的具體使用8. php模擬實(shí)現(xiàn)斗地主發(fā)牌9. vue 使用localstorage實(shí)現(xiàn)面包屑的操作10. Vue封裝一個(gè)TodoList的案例與瀏覽器本地緩存的應(yīng)用實(shí)現(xiàn)

網(wǎng)公網(wǎng)安備