Ribbon的负载均衡策略及原理

Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡等等,很多地方都使用到了负载均衡。

使用负载均衡带来的好处很明显:

1.当集群里的1台或者多台服务器down的时候,剩余的没有down的服务器可以保证服务的继续使用

2.使用了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致系统cpu急剧上升

负载均衡有好几种实现策略,常见的有:

1.随机 (Random)

2.轮询 (RoundRobin)

3.一致性哈希 (ConsistentHash)

4.哈希 (Hash)

5.加权(Weighted)

ILoadBalance 负载均衡器

ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等等。ILoadBalance的继承关系如下:

负载均衡器是从EurekaClient(EurekaClient的实现类为DiscoveryClient)获取服务信息,根据IRule去路由,并且根据IPing判断服务的可用性。负载均衡器多久一次去获取一次从Eureka Client获取注册信息呢?在BaseLoadBalancer类下,BaseLoadBalancer的构造函数,该构造函数开启了一个PingTask任务setupPingTask();,代码如下:

    public BaseLoadBalancer(String name, IRule rule, LoadBalancerStats stats,

            IPing ping, IPingStrategy pingStrategy) {

        if (logger.isDebugEnabled()) {

            logger.debug("LoadBalancer:  initialized");

        }

        this.name = name;

        this.ping = ping;

        this.pingStrategy = pingStrategy;

        setRule(rule);

        setupPingTask();

        lbStats = stats;

        init();

    }

相关文章