微服务负载均衡器Ribbon

1.什么是Ribbon
目前主流的负载方案分为以下两种:
集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。
客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡。

Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超 时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也 可以实现我们自己的负载均衡算法。

1.1 客户端的负载均衡
例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是 客户端负载均衡;即在客户端就进行负载均衡算法分配。

1.2 服务端的负载均衡

例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进
行负载均衡算法分配。

1.3 常见负载均衡算法
随机,通过随机选择服务进行执行,一般这种方式使用较少; 轮训,负载均衡默认实现方式,请求来之后排队处理; 加权轮训,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力; 地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。 ip —>hash
最小链接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分 配到当前压力最小的服务器上。 最小活跃数

2.Nacos使用Ribbon
nacos-discovery依赖了ribbon,可以不用再引入ribbon依赖


2)添加@LoadBalanced注解


3) 修改controller


3 Ribbon负载均衡策略


IRule 这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。 AbstractLoadBalancerRule
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,这里定义它的目的主要是辅助负责均衡策略选取合适的服务端实例
RandomRule 看名字就知道,这种负载均衡策略就是随机选择一个服务实例,看源码我们知道,在RandomRule的无参构造方法中初始化了一个Random对象, 然后在它重写的choose方法又调用了choose(ILoadBalancer lb, Object key)这个重载的choose方法,在这个重载的choose方法中,每次利用 random对象生成一个不大于服务实例总数的随机数,并将该数作为下标所以获取一个服务实例。
RoundRobinRule
RoundRobinRule这种负载均衡策略叫做线性轮询负载均衡策略。这个类的choose(ILoadBalancer lb, Object key)函数整体逻辑是这样的:开启 一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetModulo方法获取一个下标,这个下标是一个不断自增长 的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加 1,如果连续10次都没有取到服务,则会报一个警告No available alive servers after 10 tries from load balancer: XXXX。
RetryRule(在轮询的基础上进行重试) 看名字就知道这种负载均衡策略带有重试功能。首先RetryRule中又定义了一个subRule,它的实现类是RoundRobinRule,然后在RetryRule的 choose(ILoadBalancer lb, Object key)方法中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返 回,如果选择的服务实例为null或者已经失效,则在失效时间deadline之前不断的进行重试(重试时获取服务的策略还是RoundRobinRule中定义的 策略),如果超过了deadline还是没取到则会返回一个null。
WeightedResponseTimeRule(权重 —nacos的NacosRule ,Nacos还扩展了一个自己的基于配置的权重扩展) WeightedResponseTimeRule是RoundRobinRule的一个子类,在WeightedResponseTimeRule中对RoundRobinRule的功能进行了扩展, WeightedResponseTimeRule中会根据每一个实例的运行情况来给计算出该实例的一个权重,然后在挑选实例的时候则根据权重进行挑选,这样能 够实现更优的实例调用。WeightedResponseTimeRule中有一个名叫DynamicServerWeightTask的定时任务,默认情况下每隔30秒会计算一次 各个服务实例的权重,权重的计算规则也很简单,如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大。
ClientConfigEnabledRoundRobinRule ClientConfigEnabledRoundRobinRule选择策略的实现很简单,内部定义了RoundRobinRule,choose方法还是采用了RoundRobinRule的 choose方法,所以它的选择策略和RoundRobinRule的选择策略一致,不赘述。
BestAvailableRule BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据 loadBalancerStats中保存的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而 loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即 ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。
ZoneAvoidanceRule默认规则,复合判断server所在区域的性能和server的可用性选择服务器。)
ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件,ZoneAvoidanceRule中的过滤条件是以 ZoneAvoidancePredicate为主过滤条件和以 AvailabilityPredicate为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询 (RoundRobinRule)的方式从过滤结果中选择一个出来。

AvailabilityFilteringRule(先过滤掉故障实例,再选择并发较小的实例)
过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来 包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。

3.2.1 修改默认负载均衡策略


注意:此处有坑。不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的
RibbonClients共享。 不建议这么使用,推荐yml方式



利用@RibbonClient指定微服务及其负载均衡策略。



配置文件:调用指定微服务提供的服务时,使用对应的负载均衡算法 修改application.yml
3.2.2 自定义负载均衡策略
通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。 1)实现基于Nacos权重的负载均衡策略


2) 配置自定义的策略
2.1)配置文件: 修改application.yml


3.3 饥饿加载

在进行服务调用的时候,如果网络情况不好,第一次调用会超时。
Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。


开启饥饿加载,解决第一次调用慢的问题


源码对应属性配置类:RibbonEagerLoadProperties
测试:


3.Ribbon内核原理
3.1 Ribbon原理

微服务负载均衡器Ribbon相关推荐

  1. Spring Cloud Alibaba全家桶(三)——微服务负载均衡器Ribbon与LoadBalancer

    前言 本文为 微服务负载均衡器Ribbon与LoadBalancer 相关知识,下边将对什么是Ribbon(包括:客户端的负载均衡.服务端的负载均衡.常见负载均衡算法),Nacos使用Ribbon,R ...

  2. 3:Alibaba微服务负载均衡器Ribbon

    Spring Cloud Alibaba系列目录 提示:这里是第三章:Alibaba微服务负载均衡器Ribbon 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组件Naco ...

  3. 最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇

    文章目录 前言 一.Ribbon核心概念 二.服务器端负载均衡和Riboon客户端负载均衡 1.服务器端负载均衡: 2.Riboon客户端负载均衡: 三.Ribbon策略 四.Ribbon配置使用 五 ...

  4. 【SpringCloud复习巩固】微服务+Eureka+Ribbon

    文章中需要用到的代码和sql 链接:https://pan.baidu.com/s/1_1Qqro7wR5zi7Ds8Bgmf-g 提取码:vxzg 目录 一.微服务 1.1单体架构 1.2分布式架构 ...

  5. spring cloud 微服务调用--ribbon和feign调用

    这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...

  6. SpringCloud微服务:Ribbon和Feign组件,实现服务调用的负载均衡

    一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TCP客户端的访问控制. 2.负载均衡简介 目前主流的负载均衡 ...

  7. 2:Alibaba微服务组件Nacos注册中心

    Spring Cloud Alibaba系列目录 提示:这里是第二章:Alibaba微服务组件Nacos注册中心 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组件Naco ...

  8. 1:微服务和Spring Cloud Alibaba介绍

    Spring Cloud Alibaba系列目录 提示:这里是第一章:微服务和Spring Cloud Alibaba介绍 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组 ...

  9. 微服务精通之Hystrix原理解析

    前言 经过微服务精通之Ribbon原理解析的学习,我们了解到了服务消费者获取服务提供者实例的过程,在这之后,服务消费者会调用服务提供者的接口.但是在调用接口的过程中,我们经常会遇见服务之间的延迟和通信 ...

最新文章

  1. (Question)CSS中position的绝对定位问题
  2. 前后端分离djangorestframework—— 在线视频平台接入第三方加密防盗录视频
  3. Cocos2D粒子发射器的纹理
  4. html增加点击进入,html中实现回车或点击进入-----Mr.Zhang
  5. java 越来越慢_浅析Java语言慢的原因
  6. 2-2 工程源码文件结构
  7. mySQL建表及练习题(下)
  8. 微信看一看实时相关推荐介绍
  9. 静态方法里面不能调用非静态属性
  10. 卡通角色表情驱动系列一
  11. 什么是VR、AR和MR
  12. 完整的CJK Unicode范围(5.0版)
  13. 常用的eclipse插件下载地址
  14. 网吧服务器管理维护,网吧服务器常用设置维护工具
  15. 计算机打印指定测试页到文件夹中,打印机可以打测试页,但不能打印别的文件,怎么处理...
  16. batchplot插件用法_batchplot批量打印怎么用?Batchplot(CAD批量打印工具)安装步骤
  17. 增强型绿植植被指数_植被指数计算方法
  18. java 中rest,Java中的REST调用
  19. 关于html中锚点功能的使用
  20. 微信公众号网页授权域名证书验证位置

热门文章

  1. ADM485ANZ ADI
  2. python数据分析之曲线拟合(1):二次函数拟合
  3. java+springmvc+vues 基于ssm的网上球鞋竞拍系统#毕业设计
  4. Flask从入门到放弃(介绍、模版语法案例、配置文件、路由本质、CBV整体流程)
  5. Spring事务使用场景
  6. adobe cep html engine 停止工作,ps2019adobe cep html engine应用程序错误怎么办?
  7. [案例] 知行 EDI 无缝替换 Sterling B2B Integrator
  8. 环境综合传感监控系统、智慧城市、智慧工地、情报分析系统、探针人流、预警系统、监控列表、mac人库、气象监测、探针分析、渣土受纳、扬尘、噪声、建筑工地、图像证据库、图像记录、地图监视、行为预测、行为轨迹
  9. vc获取硬盘物理序列号
  10. 惠普ml系列服务器,惠普入门ML110与ML115服务器简要对比