3.1 负载均衡原理
本书第2章提到了注册中心存在的意义,同时也演示了使用DiscoveryClient或Reactive-DiscoveryClient获取注册中心上的服务对应的所有实例。在使用过程中,我们发现一个问题:在注册中心返回的实例列表中,我们要选择哪个实例呢?
这就需要使用负载均衡算法解决这个问题(以上代码中,LoadBalancerClient 相当于一个客户端负载均衡组件)。
常见的负载均衡算法如下:
·随机(Random)算法:在实例列表中随机选择某个实例。
·轮询(RoundRobin)算法:循环取下一个。比如,一共有3个实例,第一次取第 1个,第二次取第2个,第三次取第3个,第四次取第1个,以此类推。
·最少连接数(Least Connections)算法:每次取连接数最少的实例。
·一致性哈希(Consistent Hashing)算法:基于一致性哈希算法总是将相同参数的请求落在同一个实例上。
·权重随机(Weightd Random)算法:比如有4个实例,实例A权重为10,实例B权重为30,实例C权重为40,实例D权重为20。每次随机取100内的整数,若结果在1~10之间,则选择实例A,在11~40之间选择实例B,在41~80之间选择实例C,在81~100之间选择实例D。
Spring Cloud 在特性列表中声明了支持 Load Balancing(负载均衡),这里的负载均衡指的是客户端负载均衡。
提示:维基百科对负载均衡是这样定义的,负载均衡(Load Balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间,同时避免出现过载的目的。
客户端负载均衡表示这个操作是在客户端进行的,客户端获取了所有的实例列表,并且根据算法选择其中一个实例。
有了负载均衡特性之后,在开发过程中无须获取 ServiceInstance 列表,而是直接进行服务调用,因为Spring Cloud在底层屏蔽了负载均衡的逻辑。
负载均衡是一个通用的特性,所有的 RPC 框架都会有这个概念的实现。比如,Apache Dubbo内部提供了LoadBalance组件来完成负载均衡。
Spring Cloud官方也提供了两种客户端负载均衡的实现:
·Spring Cloud LoadBalancer:2019年7月3日,在Hoxton.M1的发布公告上,Spring宣布更新该项目来代替Netflix Ribbon。
·Spring Cloud Netflix Ribbon:Netflix开发的一款客户端负载均衡组件。
由于Netflix Ribbon和Spring Cloud Netflix Ribbon组件都已进入维护模式,目前官方推荐使用Spring Cloud LoadBalancer(后文简称SCL)。目前SCL的功能跟Ribbon相比还比较弱(比如,Ribbon提供了熔断特性,当同一个实例发生3次错误后,就会被“熔断”一段时间,这段时间内该实例永远不会被选择)。笔者现阶段还是推荐使用Ribbon,预计SCL在未来的版本中会逐渐更新更多的功能,并达到可以替换Ribbon的状态。