1 public String getServerIP() {
2 //新建map,避免出现服务器上线、下线引发的并发问题
3 Map<String, Integer> serverMap = new HashMap<String, Integer>();
4 serverMap.putAll(serverWeightMap);
5 Set<String> keySet = serverMap.keySet();
6 Iterator<String> iterator = keySet.iterator();
7 //新建空的服务器列表list
8 List<String> serverList = new ArrayList<String>();
9 while(iterator.hasNext()) {
10 String server = iterator.next();
11 Integer weight = serverMap.get(server);
12 //若该服务器的权重为4,则在服务器列表中添加四个该服务器
13 for (int i = 0; i < weight; i++) {
14 serverList.add(server);
15 }
16 }
17 Integer pos = 0;
18 String server = null;
19 synchronized (pos) {
20 if (pos >= serverList.size()) {
21 pos = 0;
22 }
23 server = serverList.get(pos);
24 pos++;
25 }
26 return server;
27 }
1 public String getServerIP() {
2 //新建map,避免出现服务器上线、下线引发的并发问题
3 Map<String, Integer> serverMap = new HashMap<String, Integer>();
4 serverMap.putAll(serverWeightMap);
5 Set<String> keySet = serverMap.keySet();
6 Iterator<String> iterator = keySet.iterator();
7 //新建空的服务器列表list
8 List<String> serverList = new ArrayList<String>();
9 while(iterator.hasNext()) {
10 String server = iterator.next();
11 Integer weight = serverMap.get(server);
12 //若该服务器的权重为4,则在服务器列表中添加四个该服务器
13 for (int i = 0; i < weight; i++) {
14 serverList.add(server);
15 }
16 }
17
18 Random random = new Random();
19 int pos = random.nextInt(serverList.size());
20 return serverList.get(pos);
21 }
以上算法我们都是为了平均给后端服务器分配工作量,最大程度的提高服务器的利用率,但是实际情况并非一定如此,我们可以从算法实施的角度来看,以后端服务器的视角来观察系统的负载,而非请求发起方来观察。因此,我们需要有其他的算法来实现可供选择,最小连接法变属于此类算法。
最小连接法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理快慢不同,它正是根据后端服务器当前的连接情况动态选取当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后端服务器的利用效率,将负载合理的分流到每一台机器。