Ribbon负载均衡策略总结


Ribbon负载均衡策略总结

引言

  学过Spring Cloud/Spring Boot的可能都或多或少的听过用过Ribbon,而正是这个短小而又精悍的组件,因为本身可插拔的独特与便捷性,与Eureka、feign、gateway、zuul、hystrix甚至自定义SpringBoot都能完美融合使用。而今天,我们将抛砖引玉,从Ribbon中总结出他的核心:负载均衡策略

1. RandomRule - 随机

从可用服务节点中,随机挑选一个节点进行访问。

yield+自旋的方式做重试,采用了严格的防御型编程

拓展:防御型编程

while(server == null){

    if(Thread.interrupted()){
        return null;
    }

    if(list.get(count)==null){
        Thread.yield();
        continue;
    }
}

防御型编程:基本可以确定list中的server不会为null,但是也会判空并且为空时进行线程出让,到下一个循环
yield:Thread.yield方法,表示当前线程发生退让,其他线程可以优先获得当前资源

2. RoundRobinRule - 轮询(Ribbon默认负载均衡策略)

轮询

很实在,就是采用轮询的机制把列表中的节点一个个的分发过去

Q:那么如何保证多线程安全(多个请求到来如何保证顺序)?
A:根据CAS + 自旋锁的方式来进行同步操作,防止多线程请求的情况下按照顺序下发到节点

3. RetryRule - 重试机制

Ribbon里的这一策略秉承了23种经典设计模式之一的装饰模式,直白的理解就是为其他负载均衡策略加上重试的功能

可以类比Java IO流中的InputStream下有ObjectInputStream/FileInputStream/ByteInputStream等等,为输入流提供转化成对象/文件/字节等功能

4. WeightedResponseTimeRule - 权重

Ribbon中这一负载均衡策略,会根据服务节点的响应时间计算权重,响应时间越长权重越低,此机器被选中的概率也越低

当然,在初期采样不足时,聪明的Ribbon也想到了,他们决定先采用轮询才收集样本,积累足够后会自动切换成权重机制

权重

5. BestAvailableRule - 最少连接数/并发

Ribbon在过滤掉故障服务后,对基于过去30分钟的统计结果来选取当前并发量最小的服务节点,也就是最闲的节点来下发请求。相同的,采样不足时先使用备胎..不,轮询来负责。

最少连接数

6. AvailabilityFilteringRule - 条件/要求

顾名思义,节点列表中需要满足一定条件的节点才可能被初步选中,并且这个节点不能处于熔断状态,还有请求数也不能超过特定阈值,才可被选中下发(选中后不幸宕机,则会发起重试,失败则再选择下一个节点)

条件

7. ZoneAvoidanceRule - 组合过滤

1.每个在Eureka注册的节点都有三个身份信息:Zone、Region和URL,Zone可以理解为机房大区,这个策略会对每个节点的Zone做健康检查,筛选返回健康的节点列表
2.对筛选出来的列表做可用性过滤(如AvailabilityFilteringRule一样排除处于熔断状态的节点以及并发压力大(超过阈值)的结点)

组合过滤

8. 加餐:LVS的负载均衡

LVS,全称为Linux Virtual Server,本质上就是一个负载均衡器,是linux上的虚拟服务,属于四层负载均衡(IP+端口),只负责转发请求。业界一般使用 keepalived+Lvs+Nginx 来搭建高可用集群负载均衡

【四层负载均衡】:基于IP+端口的负载均衡,只负责转发并且记录当前链接由哪个服务器处理,后续这个链接的请求也会由这一台服务器去处理(相当于浏览器的长连接(keep-alive)),一般使用LVS,F5(F5成本很高)
【七层负载均衡】:不仅可以转发,也可以处理JS,CSS或者压缩等,一般使用Nginx,Apache(apache远不如nginx,百万级别性能降低)

LVS的源地址散列:等同于Nginx的ip-hash负载均衡算法,通俗地讲,就是LVS/Nginx通过把IP做hash之后对当前服务器总数取模分配到特定服务器,目的:确保同一个用户的请求能落到同一个服务器上

LVS的负载均衡算法有很多,这里来简单介绍以下源地址散列,具体其他的可参考笔者之前的笔记:LVS的负载均衡算法-有道云笔记

hash算法

【%】表示求模
【node_counts】表示服务器的数量
【7 % 3 = 1】表示 7除以3余1 所以等于1
ip-hash负载均衡算法其实也有比较明显的缺点,例如对于ip动态变化的用户不太友好,新增/减少服务器都会与原来计算结果背道而驰,这时候可以考虑一致性hash算法(一致性hash算法-有道云笔记

9. 总结

当然,除了以上的负载均衡策略,其实还有很多没列举出来的,例如Nginx中的最少连接策略、加权轮询等各种加权组合策略等,我们主要还是从中学习理解思想。


评论
  目录