Java加权负载均衡策略

Posted wanli002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

@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,避免服务器的上下线导致的并发问题
   	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();
   	}

   }

}

多线程输出结果

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

以上是关于Java加权负载均衡策略的主要内容,如果未能解决你的问题,请参考以下文章

dubbo的负载均衡策略之RandomLoadBalance加权随机策略源码分析

Nginx——nginx作为负载均衡服务(轮询策略与加权轮询)

nginx负载均衡

Dubbo加权轮询负载均衡的源码和Bug,了解一下?

干货 | JAVA面试题(架构篇)

Dubbo的负载均衡策略