Ribbon是什么

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单来说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助我们基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们很容易使用Ribbon实现自定义的负载均衡算法

下图是Eureka使用Ribbon时的大致架构

Nginx和Ribbon区别

负载均衡分为集中式和进程内

集中式负载均衡:

即在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,如FS,也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发到提供方

进程内负载均衡:

将负载均衡逻辑集成到消费方,消费方从服务注册中心获知哪些地址可用,然后自己再从这些地址中选择一个合适的服务器,Ribbon就属于进程内负载均衡,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

Nginx是服务器负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的,因此Nginx是集中式

Ribbon是本地负载均衡,再调用微服务接口时,会在注册中心上拉取注册信息服务列表之后缓存到本地,从而在本地实现远程服务调用技术,因此Ribbon是进程内

应用场景的区别

Nginx适合服务端实现负载均衡,比如Tomcat,而Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,如SpringCloud和Dubbo都是采用本地负载均衡。

Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例

使用案例

①引入依赖

在我们的pom文件中,并没有引入我们的Ribbon的依赖,但是我们引入了eureka的客户端依赖,里面就已经跟Ribbon整合了(因此不用引用Ribbon的依赖,但是引入也不错)

②Ribbon通常和RestTemplate一起使用

Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心ip地址和端口号

主启动类

微服务(服务提供者)集群搭建:

 可以看出来,我们的服务提供者都是cloud-payment-service,只是端口号不一样,此时启动我们的服务,进入Eureka页面

但是我们发起的请求(http://cloud-payment-service/XXX)我们的浏览器是不能解析的,不是真实可用的地址,需要通过Ribbon来拦截我们的请求,然后Ribbon发送给Eureka服务端拉cloud-payment-service,然后Eureka服务端返回服务列表给Ribbon,然后Ribbon通过负载均衡来轮询到指定的服务

我们主程序中的配置类上面的@LoadBalanced注解,标记我们RestTemplate发起的请求需要被Ribbon进行拦截

我们进行源码分析:

我们找到LoadBalancerInterceptor这个类,点进去ClientHttpRequestInterceptor

我们发现有一个intercept接口方法,这个方法就会拦截我们的http请求,而我们的RestTemplate正是发送http请求的

我们来到LoadBalancerInterceptor类实现intercept方法

其中request.getURI()就获取了我们发起请求的地址

http://cloud-payment-service/XXX;

然后通过originalUri.getHost()获取了主机名称:cloud-payment-service

然后return语句中的loadBalancer就是RibbonLoadBalancerClient的对象(此时就见到了Ribbon),然后执行execute方法执行

我们找到LoadBanlanceClient的实现类RibbonLoadBalancerClient

这就是我们Ribbon拉取Eureka服务端的请求地址

接下来我们进行轮询,选择一个服务

接下来的getServer方法就是负载均衡,一直往下走,就会有一个rule.choose(),这个rule是接口IRule接口的实现类,然后我们查看IRule的实现类,发现有

其中RoundRibinRule就是轮询的意思,轮询负载均衡,执行完getServer方法之后,就会拿到8081这个端口,因此就可以用真实的ip代替我们RestTemplate发起的不能解析的请求,实现正常的请求访问

总结一下:

请求会被一个叫LoadBalancerInterceptor(负载均衡拦截器)的拦截器拦截,拦下来以后得到请求中的服务名称交给RibbonLoadBalancerClient,然后RibbonLoadBalancerClient就会把服务名称交给DynamicServerListLoadBalancer,DynamicServerListLoadBalancer就会去eureka中拉取服务列表,然后DynamicServerListLoadBalancer就会找一个IRule,IRule就会根据拉取来的服务列表基于规则轮询,选择某个服务,然后返回给我们的RibbonLoadBalancerClient,然后RibbonLoadBalancerClient就会用ip和端口替换服务名称,得到真实的地址

IRule策略

其中IRule接口决定了负载均衡的策略

默认的是zoneAvoidanceRule,它的父类的父类后面是RoundRobinRule结尾的,因此zoneAvoidanceRule也有轮询的功能

RetryRule是先按照RoundRobinRule的策略获取服务,如果获取失败的话则在指定时间内会进行重试,获取可用的服务

WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择

BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个

AvailablityFilteringRule:先过滤掉故障实例,再选择并发较小的实例

ZoneAvoidanceRule:默认规则,符合判断server所在区域的性能和server的可用性选择服务器

此时我们的服务器集群总数量,是我们去访问的服务的集群总数量,并不是所有微服务的总集群数量!!!

我们研究一下我们的默认的RoundRobinRule的源码

我们的IRule里面的choose就是我们选择的规则

找到我们的RoundRobinRule,其中实现了我们的choose方法

这就是我们的Ribbon的负载均衡!!!

Spring Cloud之Ribbon相关推荐

  1. spring cloud整合Ribbon

    spring cloud整合Ribbon 使用Eureka中自带的Ribbon 如果你使用的是Eureka做服务发现和注册的话,在比较新版本的Eureka中,Eureka已经集成了Ribbon进入Eu ...

  2. spring cloud 之 Ribbon

    1.Ribbon是什么 Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具.Netflix Ribbon 是 Netflix 公司发布 ...

  3. Spring Cloud入门-Ribbon服务消费者(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Ribbon简介 RestTemplate的使用 GET请求方法 getForObject方法 getForEntity方法 POST请求方法 p ...

  4. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务

    在Eureka Server 集群基础上,使用Spring RestTemplate,结合Ribbon功能进行服务调用,使用方式非常简单. 1.在主项目中新建一个模块,eurekaclient,mav ...

  5. Spring Cloud入门 -- Ribbon服务消费者(Hoxton.SR5版)

    Ribbon简介 Ribbon是Netflix公司开源的客户端负载均衡器,可以控制Http和Tcp客户端的负载均衡. Ribbon默认提供了很多负载均衡算法,如:轮询.随机等,也可以实现自定义的负载均 ...

  6. Spring Cloud Netfilx Ribbon(负载均衡工具)

    一.介绍 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的 ...

  7. 深入浅出Spring Cloud Netflix - Ribbon

    文章目录 一.负载均衡 1.Load Balance是什么 2.负载均衡的分类 二.Ribbon详解 1.什么是Ribbon 2.Ribbon目前进入维护模式 3.Ribbon的工作流程 4.Ribb ...

  8. 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?

    在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...

  9. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务使用Hystrix熔断器

    在服务调用中增加Hystrix熔断器,是在单个服务出现故障的时候快速失败,也可以提供回退方案,避免因为线程等待耗尽整个服务的线程资源:Hystrix DashBoard监控组件,可以实时监控熔断器的状 ...

最新文章

  1. Spring Countries在Apusic上部署
  2. 对家庭网络设备行业的理解
  3. 这家获得谷歌投资的企业想把亚马逊挑下神坛
  4. Algorithm之RS:RS常用的一些库
  5. Asp.net常用优化方法
  6. pycharm中无法安装scipy、imread、GDAL等库
  7. 12v电量显示制作方法_如何制作老式12v充电器(四款12v充电器设计制作详解)
  8. npm:can not find module 'xxx'
  9. 网络模块(客户端的连接动作)
  10. 这届全明星,把NBA又燃回来了
  11. 二叉树C++ | 链表递归实现二叉树(插入、搜索)_1
  12. Qt常用类——QWidget
  13. php 按位左移,PHP位运算符
  14. G4L---linux系统---硬盘对拷(克隆)
  15. 跟我学Spring Cloud(Finchley版)-18-Zuul深入
  16. 01-SQL基本语句
  17. 小程序按钮如何制作?
  18. java getbytes_JAVA的getBytes()方法
  19. html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
  20. BEC listen and translation exercise 39

热门文章

  1. 大胆预测一波:23年软件测试行业的趋势及前景
  2. 游戏产业撬动元宇宙市场 虚拟现实引爆计算力需求
  3. 这篇面试指南我吹不动了,凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer
  4. 重力加速计低通滤波算法——安卓开发文档
  5. 【算法】GBDT XGBoost
  6. 2022年广东江门市江海区外海街道办事处招聘专职网格员试题及答案
  7. 什么是CDN内容分发网络?【刘新宇】
  8. 详解Guitar Pro显示和弦图的步骤
  9. [Poi0504]Piggy Banks小猪存钱罐 (并查集)
  10. 51单片机c语言年月日设定,综合实例:51单片机(AT89C52)万年历(温度闹钟年月日时分秒星期)...