Ribbon负载均衡策略

ribbon是一个客户端负载均衡器,类似于nginx的负载均衡模块功能

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

主流的负载均衡方案分为两类:

1.集中式的负载均衡,即在服务的消费方和提供方之间使用独立的设备,如nginx、F5等,通过这种设施将访问的请求通过某种策略转发至服务的提供方
2.进程内的负载均衡,将负载均衡策略逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可以用,然后再从这些地址中选择一个合适的服务器,Ribbon就是进程内的负载均衡策略,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

使用负载均衡的好处:

当集群的一台或者多台服务器挂掉的时候,剩余的没有挂的服务器可以保证服务的继续使用
使用了更多机器保证机器的良性使用,不会由于某一时刻并发量上升导致服务器压力过大

负载均衡常见的策略:

  • 随机 (Random)
  • 轮询 (RoundRobin)
  • 一致性哈希(ConsistentHash)
  • 哈希(Hash)
  • 加权(Weighted)

Ribbon的组件

接口

作用

默认实现

IClientConfig

读取配置

DefaultClientConfigImpl

IRule

负载均衡规则,根据规则选择实例

ZoneAvoidanceRule(轮询)

IPing

筛选掉ping不通的实例

DummyPing

ServerList< Server>

交给Ribbon的实例列表

Ribbon:ConfigurationBasedServerList Spring Cloud Alibaba:NacosServerList

ServerListFilter< Server>

过滤掉不符合条件的实例

ZonePreferenceServerListFilter

ILoadBalance

Ribbon的入口

ZoneAwareLoadBalance

ServerListUpdater

更新交给Ribbon的List的策略

PollingServerListUpdater

ribbon版本:2.2.2->ribbon-loadbalancer版本:2.3.0

IRule

IRule路由接口代表负载均衡策略

/**
 * Interface that defines a "Rule" for a LoadBalancer. A Rule can be thought of
 * as a Strategy for loadbalacing. Well known loadbalancing strategies include
 * Round Robin, Response Time based etc.
 * 
 * @author stonse
 * 
 */
public interface IRule{
    /*
     * choose one alive server from lb.allServers or
     * lb.upServers according to key
     * 
     * @return choosen Server object. NULL is returned if none
     *  server is available 
     */

    public Server choose(Object key);
    
    public void setLoadBalancer(ILoadBalancer lb);
    
    public ILoadBalancer getLoadBalancer();    
}

IRule接口的实现类有以下几种

Ribbon负载均衡优化 rebbion负载均衡方式_Server

如何设置负载均衡策略

编写配置类转载指定的bean

/**
 * RetryRule 重试策略
 * AvailabilityFilteringRule 可用过滤策略
 * ResponseTimeWeightedRule 响应时间加权重策略
 * ZoneAvoidanceRule 根据区域的性能和服务的可用性等权重选择服务,如果没有区域就类似于轮询
 * RoundRobinRule 最基本的轮询选择
 * RandomRule 随机策略
 * WeightedResponseTimeRule 加权策略
 * BestAvailableRule 最小请求数策略
 */
@Configuration()
public class RibbonClientDefaultConfigurationConfig {

    @Bean
    public IRule ribbonRule() {
        return new ZoneAvoidanceRule();
    }
}

特别注意,如果注册中心有多个服务的情况下,需要将注册的策略实现类设为多例,否则会出现请求指向错误