作者|雷哥来源|Java中文社区(ID:javacn666)转载请联系授权(微信ID:GG_Stone)。负载均衡器通常有两种实现方式,一种是服务端负载均衡器,另一种是负载均衡器。一个是客户端负载均衡器,而我们今天的主角Ribbon就属于后者——客户端负载均衡器。服务端负载均衡器的问题是提供了更强的流量控制权,但是不能满足不同消费者想要使用不同负载均衡策略的需求,确实存在使用不同负载均衡策略的场景,所以客户端到端负载平衡提供了这种灵活性。但是,客户端负载平衡也有其缺点。如果配置不当,可能会导致服务商出现热点,或者根本得不到服务,那么本文就来了解一下这7种内置的负载均衡策略的具体规则。.Ribbon简介Ribbon是SpringCloud技术栈中非常重要的基础框架。它为SpringCloud提供了负载均衡的能力。比如Fegin和OpenFegin都是基于Ribbon实现的。就连Nacos中的负载均衡也是用的Ribbon框架。Ribbon框架的强大之处在于它不仅内置了7种负载均衡策略,还支持用户自定义负载均衡策略,因此其开放性和便捷性也是其受欢迎的主要原因。服务器端负载均衡器和客户端负载均衡器的区别如下图所示:客户端负载均衡器的实现原理是通过注册中心拉取可用的服务列表到本地(客户端),比如Nacos,然后通过客户端负载均衡器(设置的负载均衡策略)获取某个服务器的具体ip和端口,然后通过Http框架请求服务,得到结果。执行过程如下图所示:以设置负载均衡为例,只需在配置文件application.yml中设置如下配置即可:springcloud-nacos-provider:#nacosribbon中的服务id:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RoundRobinRule#设置负载均衡策略因为在Nacos中已经内置了Ribbon,所以在实际项目开发中不需要添加Ribbon依赖。我们在Nacos的依赖树中可以看到这一点,如下图所示:Ribbon默认的负载均衡策略是轮询方式。我们配置三个服务提供者的执行结果如下图所示:然后,我们将Ribbon负载均衡策略设置为随机模式,配置内容如下:springcloud-nacos-provider:#nacosribbon中的服务id:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule#设置随机负载均衡重启客户端,执行结果如下图:七种负载均衡策略1.轮询策略轮询策略:RoundRobinRule,在一个周期内调用服务实例一定的顺序。比如一共有3个服务,第一次调用服务1,第二次调用服务2,第三次调用服务3,以此类推。该策略的配置设置如下:springcloud-nacos-provider:#nacosribbon中的Serviceid:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RoundRobinRule#设置负载均衡2.权重策略权重策略:WeightedResponseTimeRule,根据每个服务提供商的响应时间被赋予一个权重,响应时间越长,权重越低,被选中的概率越低。它的实现原理是开始使用轮询策略并启动一个定时器,每隔一段时间收集所有服务提供者的平均响应时间,然后给每个服务提供者附加一个权重,权重越高被选中的概率也越大更大。该策略的配置设置如下:springcloud-nacos-provider:#nacosribbon中的serviceid:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.WeightedResponseTimeRule3,randomstrategyrandomstrategy:RandomRule,从服务列表中随机选择一个服务实例供应商。该策略的配置设置如下:springcloud-nacos-provider:#nacosribbon中的Serviceid:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule#设置负载均衡4.最小连接数策略最小连接数策略:BestAvailableRule,也叫最小并发策略,遍历服务提供者列表,选择一个连接数最少的服务实例。如果有相同的最小连接数,则调用轮询策略进行选择。该策略的配置设置如下:springcloud-nacos-provider:#nacosribbon中的Serviceid:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.BestAvailableRule#设置负载均衡5.重试策略重试策略:RetryRule,根据轮询策略获取服务。如果获取到的服务实例为null或者已经过期,则会在指定时间内继续重试获取服务。如果超过指定时间仍未获取到服务实例,则返回null。该策略的配置设置如下:ribbon:ConnectTimeout:2000#请求连接的超时时间ReadTimeout:5000#请求处理的超时时间springcloud-nacos-provider:#nacos中的服务idribbon:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule#设置负载均衡6.可用性敏感策略可用敏感策略:AvailabilityFilteringRule,先过滤掉不健康的服务实例,再选择连接数较小的服务实例。这个policy的配置设置如下:springcloud-nacos-provider:#nacosribbon中的serviceid:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.AvailabilityFilteringRule7,zone-sensitivepolicyzone-sensitivepolicy:ZoneAvoidanceRule,根据性能和的服务的可用性用于选择服务实例。在没有区域的环境中,这种策略类似于循环策略。该策略的配置设置如下:springcloud-nacos-provider:#serviceidinnacosribbon:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.ZoneAvoidanceRule项目源码https://gitee.com/mydb/spring-cloud-alibaba-例子。总结Ribbon是一个客户端负载均衡器,它比服务端负载均衡器的统一负载均衡策略提供了更大的灵活性。Ribbon内置了7种负载均衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域敏感策略,用户可以通过继承RoundRibbonRule实现自定义负载均衡策略。
