Java加權(quán)負(fù)載均衡策略實(shí)現(xiàn)過程解析
加權(quán)輪詢
后端集群每臺機(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; @Controller public 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é)果
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
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
servlet之web路徑問題_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了servlet之web路徑問題的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別分析
這篇文章主要介紹了JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別,Java Database Connectivity,它是代表一組獨(dú)立于任何數(shù)據(jù)庫管理系統(tǒng)(DBMS)的API,聲明在java.sql與javax.sql包中,是SUN(現(xiàn)在Oracle)提供的一組接口規(guī)范2023-04-04SpringBoot集成Shiro進(jìn)行權(quán)限控制和管理的示例
這篇文章主要介紹了SpringBoot集成Shiro進(jìn)行權(quán)限控制和管理的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03java通過Excel批量上傳數(shù)據(jù)的實(shí)現(xiàn)示例
Excel批量上傳是常見的一種功能,本文就來介紹一下java通過Excel批量上傳數(shù)據(jù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Spring Boot如何使用Spring Security進(jìn)行安全控制
要實(shí)現(xiàn)訪問控制的方法多種多樣,可以通過Aop、攔截器實(shí)現(xiàn),也可以通過框架實(shí)現(xiàn),本文將具體介紹在Spring Boot中如何使用Spring Security進(jìn)行安全控制。2017-04-04