Java加權負載均衡策略實現(xiàn)過程解析
加權輪詢
后端集群每臺機器都分配一個權重,權重高得會承擔更多的流量,相反權重低的分配的流量也會少,這種策略允許后端集群機器配置差異化
java實現(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;
@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,避免服務器的上下線導致的并發(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ù)權重組成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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解ConcurrentHashMap如何保證線程安全及底層實現(xiàn)原理
這篇文章主要為大家介紹了ConcurrentHashMap如何保證線程安全及底層實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
idea創(chuàng)建包含多個springboot module的maven project的方法
這篇文章主要介紹了idea創(chuàng)建包含多個springboot module的maven project的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
新建Maven工程出現(xiàn)Process?Terminated的問題解決
當Maven出現(xiàn)"Process terminated"錯誤時,這通常是由于配置文件或路徑錯誤導致的,本文主要介紹了新建Maven工程出現(xiàn)Process?Terminated的問題解決,感興趣的可以了解一下2024-04-04
Spring Boot如何動態(tài)創(chuàng)建Bean示例代碼
這篇文章主要給大家介紹了關于Spring Boot如何動態(tài)創(chuàng)建Bean的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-09-09

