您当前的位置: 首页 >  Java

Dongguo丶

暂无认证

  • 2浏览

    0关注

    472博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

常见的简单负载均衡算法以及Java实现

Dongguo丶 发布时间:2019-05-16 13:47:22 ,浏览量:2

读完本文你将知道: 1. 什么是负载均衡? 2. 负载均衡的几种简单实现: (1) 轮询法(Round Robin) (2)随机法(Random) (3)源地址Hash法(Hash) (4)加权轮询法(Weight Round Robin) (5)加权随机法(Weight Random) (6)最小连接数法(Least Connections)

1. 什么是负载均衡?

负载均衡(Load Balance),指由多台服务器以对称的形式组成的一个服务器集合,每台服务器都有等价的地位,都可以单独对外提供服务而无需其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服务器陈列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能。

本文主要讲解将“外部发送来的请求均匀分配到对称结构中的某一台服务器上”的各种算法, 并以Java代码来模拟实现。

下面首先来以一个IP列表来模拟集群中的机器的IP集合。

package distributed;

import java.util.HashMap;

/**
 * Created by louyuting on 17/2/7.
 */
public class IPMap {

    public static HashMap serverWeightMap = new HashMap();

    static {
        //第一个参数是IP地址,第二个是权重.
        serverWeightMap.put("192.168.1.100", 1);
        serverWeightMap.put("192.168.1.101", 2);
        serverWeightMap.put("192.168.1.102", 3);
        serverWeightMap.put("192.168.1.103", 4);
        serverWeightMap.put("192.168.1.104", 3);
        serverWeightMap.put("192.168.1.105", 2);
        serverWeightMap.put("192.168.1.106", 1);
        serverWeightMap.put("192.168.1.107", 2);
        serverWeightMap.put("192.168.1.108", 1);
        serverWeightMap.put("192.168.1.109", 4);
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
1.轮训法

轮训法其实就是按照所有地址的序列,从前往后一次访问,实现代码如下:

package distributed;

import java.util.*;

/**
 * 轮训法
 */
public class RoundRobin {

    private static Integer pos=0;

    public static String getServerIP(){

        //重新在线程本地copy一份IPMap, 避免服务器上线下线导致的并发问题
        Map  serverMap = new HashMap();
        serverMap.putAll(IPMap.serverWeightMap);

        //取的IP地址的Set
        Set ips = serverMap.keySet();

        List iplist = new ArrayList();
        iplist.addAll(ips);

        String server = null;

        synchronized (pos){
            if(pos > iplist.size())
                pos=0;

            server = iplist.get(pos);

            pos++;
        }
        return server;
    }

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        String result = null;

        for(int i=0; i            
关注
打赏
1638062488
查看更多评论
0.0729s