Feign Ribbon Hystrix 三者关系

news2025/4/14 15:35:53

在微服务架构的应用中, Feign、Hystrix,Ribbon 三者都是必不可少的,可以说已经成为铁三角。

Feign 介绍

Feign 是一款Java语言编写的 HttpClient 绑定器,在 Spring Cloud 微服务中用于实现微服务之间的声明式调用。Feign 可以定义请求到其他服务的接口,用于微服务间的调用,不用自己再写 http 请求,在客户端实现,调用此接口就像远程调用其他服务一样,当请求出错时可以调用接口的实现类来返回

Feign 是一个声明式的 web service 客户端,它使得编写 web service 客户端更为容易。创建接口,为接口添加注解,即可使用 Feign。Feign 可以使用 Feign 注解或者JAX-RS注解,还支持热插拔的编码器和解码器。Spring Cloud为Feign 添加了 Spring MVC 的注解支持,并整合了 Ribbon 和 Eureka 来为使用 Feign 时提供负载均衡。

feign源码的github地址

Ribbon 介绍

Ribbon 作为负载均衡,在客户端实现,服务段可以启动两个端口不同但servername一样的服务

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

Ribbon工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。

ribbon 源码的 github 地址

Hystrix 介绍

Hystrix 作为熔断流量控制,在客户端实现,在方法上注解,当请求出错时可以调用注解中的方法返回

Hystrix 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它也是基于Netflix的开源框架 Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。

Hystrix 源码的 github 地址

三者之间的关系图

如果微服务项目加上了 spring-cloud-starter-netflix-hystrix 依赖,那么,feign 会通过代理模式, 自动将所有的方法用 hystrix 进行包装。

在 Spring Cloud 微服务体系下,微服务之间的互相调用可以通过 Feign 进行声明式调用,在这个服务调用过程中 Feign 会通过 Ribbon 从服务注册中心获取目标微服务的服务器地址列表,之后在网络请求的过程中Ribbon就会将请求以负载均衡的方式打到微服务的不同实例上,从而实现 Spring Cloud 微服务架构中最为关键的功能即服务发现及客户端负载均衡调用。

另一方面微服务在互相调用的过程中,为了防止某个微服务的故障消耗掉整个系统所有微服务的连接资源,所以在实施微服务调用的过程中我们会要求在调用方实施针对被调用微服务的熔断逻辑。而要实现这个逻辑场景在 Spring Cloud 微服务框架下我们是通过 Hystrix 这个框架来实现的。

调用方会针对被调用微服务设置调用超时时间,一旦超时就会进入熔断逻辑,而这个故障指标信息也会返回给Hystrix组件,Hystrix组件会根据熔断情况判断被调微服务的故障情况从而打开熔断器,之后所有针对该微服务的请求就会直接进入熔断逻辑,直到被调微服务故障恢复,Hystrix断路器关闭为止。

三者之间的关系图,大致如下:

Feign 典型配置说明

Feign 自身可以支持多种 HttpClient 工具包,例如 OkHttp 及 Apache HttpClient,针对 Apache HttpClient 的典型配置如下:

feign:  #替换掉JDK默认HttpURLConnection实现的 Http Client
    httpclient:    
      enabled: true  
    hystrix:    
      enabled: true  
    client:    
    config:      
    default:              
    connectTimeout: 5000 #连接超时时间             
    readTimeout: 5000  #读取超时时间  

Hystrix 配置说明

在 Spring Cloud 微服务体系中 Hystrix 主要被用于实现实现微服务之间网络调用故障的熔断、过载保护及资源隔离等功能。

hystrix:
propagate:
request-attribute:
enabled: true
command:    #全局默认配置
default:      #线程隔离相关
execution:
timeout:
enabled: true      #是否给方法执行设置超时时间,默认为true。一般我们不要改。
isolation:
strategy: threadPool    #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。
thread:
timeoutInMilliseconds: 10000   #方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
interruptOnTimeout: true    #发生超时时是否中断方法的执行,默认值为true。不要改。
interruptOnCancel: false  #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
circuitBreaker:   #熔断器相关配置
enabled: true   #是否启动熔断器,默认为true,false表示不要引入Hystrix。
requestVolumeThreshold: 20     #启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
sleepWindowInMilliseconds: 5000    #所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
errorThresholdPercentage: 50   #窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉,默认配置为50

Ribbon 配置说明

Ribbon 在 Spring Cloud 中对于支持微服之间的通信发挥着非常关键的作用,其主要功能包括客户端负载均衡器及用于中间层通信的客户端。在基于 Feign 的微服务通信中无论是否开启 Hystrix,Ribbon 都是必不可少的,Ribbon 的配置参数主要如下:

ribbon:  
eager-load:    
enabled: true  
MaxAutoRetries: 1  #说明:同一台实例的最大自动重试次数,默认为1次,不包括首次  
MaxAutoRetriesNextServer: 1  #说明:要重试的下一个实例的最大数量,默认为1,不包括第一次被调用的实例  
OkToRetryOnAllOperations: true  #说明:是否所有的操作都重试,默认为true  
ServerListRefreshInterval: 2000  #说明:从注册中心刷新服务器列表信息的时间间隔,默认为2000毫秒,即2秒  
ConnectTimeout: 3000  #说明:使用Apache HttpClient连接超时时间,单位为毫秒  
ReadTimeout: 3000   #说明:使用Apache HttpClient读取的超时时间,单位为毫秒 

配置超时重试关系

如上图所示,在 Spring Cloud 中使用 Feign 进行微服务调用分为两层:Hystrix 的调用和 Ribbon 的调用,Feign 自身的配置会被覆盖。

而如果开启了 Hystrix,那么 Ribbon 的超时时间配置与Hystrix的超时时间配置则存在依赖关系,因为涉及到 Ribbon 的重试机制,所以一般情况下都是Ribbon的超时时间小于 Hystrix 的超时时间,否则会出现以下错误:

2019-10-12 21:56:20,208 111231 [http-nio-8084-exec-2] WARN o.s.c.n.z.f.r.s.AbstractRibbonCommand - The Hystrix timeout of 10000ms for the command operation is set lower than the combination of the Ribbon read and connect timeout, 24000ms.

Ribbon和Hystrix的超时时间配置的关系

那么Ribbon和Hystrix的超时时间配置的关系具体是什么呢?如下:

Hystrix 的超时时间=Ribbon的重试次数(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)

而 Ribbon 的重试次数的计算方式为:

Ribbon 重试次数(包含首次)= 1 + ribbon.MaxAutoRetries + ribbon.MaxAutoRetriesNextServer + (ribbon.MaxAutoRetries * ribbon.MaxAutoRetriesNextServer)

以上图中的 Ribbon 配置为例子,Ribbon 的重试次数 = 1+(1+1+1)=4,所以 Hystrix 的超时配置应该 > =4*(3000+3000)=24000毫秒。在 Ribbon 超时但 Hystrix 没有超时的情况下,Ribbon 便会采取重试机制;而重试期间如果时间超过了Hystrix的超时配置则会立即被熔断(fallback)。

如果不配置 Ribbon 的重试次数,则 Ribbon 默认会重试一次,加上第一次调用 Ribbon,总的的重试次数为2次,以上述配置参数为例,Hystrix 超时时间配置为2*6000=12000,由于很多情况下,大家一般不会主动配置 Ribbon 的重试次数,所以这里需要注意下!强调下,以上超时配置的值只是示范,超时配置有点大不太合适实际的线上场景,大家根据实际情况设置即可!

说明下,如果不启用 Hystrix,Feign 的超时时间则是 Ribbon 的超时时间,Feign 自身的配置也会被覆盖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IIC子系统

文章目录引言一、I2C 总线驱动框架二、I2C驱动框图(重点)三、I2C 子系统软件框架3.1 I2C子系统的4个关键结构体3.2 I2C总线与平台总线的结合3.3 在设备树信息添加i2c从设备3.4 新增加i2c从设备四、i2c driver驱动的编写4.1 陀螺仪和加速度工作原理4.2 mpu6050的寄存器信息和设置…

Synchronized的锁升级过程

Synchronized的锁升级过程 synchronized锁升级过程:在synchronized中引入了偏向锁、轻量级锁、重量级锁之后,当前具体使用的是synchronzed中的那种类型锁,是根据线程竞争激烈程度来决定的。 偏向锁:在锁对象的对象头中记录一下当…

中间件之Kafka实用篇

目录标题一、一些定义(一)设计kafka的初衷(二)消息的持久化(三)sendfile 技术(零拷贝)二、获取kafka三、卡夫卡客户端工具四、kafka核心API(功能)五、spring …

阶段十:总结专题(第三章:虚拟机篇)

阶段十:总结专题(第三章:虚拟机篇)Day-第三章:虚拟机篇1. JVM 内存结构2. JVM 内存参数3. JVM 垃圾回收4. 内存溢出5. 类加载6. 四种引用7. finalizeDay-第三章:虚拟机篇 1. JVM 内存结构 要求 掌握 JVM…

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

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

Qt::QOpenGLWidget 渲染天空壳

在qt窗口中嵌入opengl渲染天空壳和各种立方体一 学前知识天空壳的渲染学前小知识1 立方体贴图 天空壳的渲染就是利用立方体贴图来实现渲染流程2 基础光照 光照模型3 opengl帧缓冲 如何自定义帧缓冲实现后期特效4 glsl常见的shader内置函数 glsl编程常用的内置函数二 shader代码…

部署运行ai智障写作记录【ChatRWKV】

文章目录前言一、环境安装1.python环境:Python 3.10。2.安装一些 pip 库numpy 、tokenizers 、prompt_toolkit3.安装pytorch 1.13.1CUDA 11.7二、运行记录1、下载代码2、下载训练参数3、编辑代码运行总结前言 看到知乎一篇教程, 大佬自己弄得ai小说续写…

AI环境搭建步骤(Windows环境)

1. 安装好Anaconda3版本(1) 安装链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD本文使用Anaconda3下载链接:Anaconda5(2) 注意安装anaconda时一定要把环境变量加入windows环境中。要没有勾选,安装完后还有手动加入…

线性代数学习-2

线性代数学习-2矩阵消元消元回代消元矩阵置换矩阵逆矩阵本文转载于https://herosunly.blog.csdn.net/article/details/88713747 该文章本人认为十分有用,便自己敲一遍笔记加固印象原文链接 原文这个笔记感觉比我老师讲的更加透彻,清晰。很好的展示了线性…

车辆热管理测试方案

车辆热管理是在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生的。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统;控制和优化车辆的热量传递过程,保证各关键部件和系统安全高效运行&…

《C++ Primer Plus》(第6版)第5章编程练习

《C Primer Plus》(第6版)第5章编程练习《C Primer Plus》(第6版)第5章编程练习1. 计算闭区间内的整数和2. 重新编写程序清单5.43. 累加4. 投资价值5. 销售情况6. 销售情况27. 汽车8. 统计单词数量9. 统计单词数量210. 嵌套循环《…

(五十)大白话深入研究索引之前,先来看看磁盘数据页的存储结构

前面我们已经给大家把MySQL数据库的部分内核原理,更新语句的执行原理,事务原理以及锁原理,都初步的讲给大家听了,同时还穿插了一些相关的数据库性能优化的案例,相信现在大家已经对数据库执行增删改语句的原理有了较为深…

小程序容器与微服务架构:提高应用程序开发效率和部署速度的利器

随着移动互联网的发展,小程序已经成为了一种非常流行的应用方式,它可以在不安装任何应用的情况下,直接在移动终端设备(如:App,iPad等)中运行。微服务架构则是一种的分布式系统架构,可…

三维数据可视化软件,可视化地图是用什么做的?

可视化地图是用什么做的?数据可视化地图是一种利用空间数据来表现地理信息的方式,能够为人们提供关于地理信息的准确、直观的可视化图形,以便更好地理解相关信息。数据地图可以最直观的表达出数据之间的空间关系,因此在很多数据分…

【组织架构】中国铁路兰州局集团有限公司

1 公司简介 中国铁路兰州局集团有限公司,是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一,简称“兰局”。经过59年的发展,现已成为西北地区最大的交通运输企业之一,形成了以兰州为枢纽,由陇海铁路、包兰铁…

前端Cookie基础知识

一、简介 ​ Cookie(也称为HTTP Cookie、Web Cookie、浏览器 Cookie等等)是服务器发送到用户浏览器并保存在本地的一小块数据,该数据通常是用户账号相关的信息,不同浏览器对Cookie的数量和大小限制不同,但一般来说&am…

centos8安装

本文由个人总结,如需转载使用请标明原著及原文地址 1.下载镜像 1.1阿里镜像 可以在阿里云的镜像库里下载,阿里centos8只保留了8.5.2111如果需要别的版本看1.2 http://mirrors.aliyun.com/centos/8/isos/x86_64 1.2其他版本的镜像 下好镜像的可以跳过…

2023年1月京东“白酒”品类销售数据出炉,五粮液表现较好

鲸参谋电商数据监测的2023年1月份京东“白酒”品类销售数据出炉! 根据鲸参谋电商数据显示,2023年1月,京东平台上白酒的销量共计980万,环比增长约180%,同比去年增长约13%;销售额将近69亿,环比增长…

2021年全国职业院校技能大赛(中职组)网络安全竞赛试题A(1)

2021年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (1) 这里是21的试题就以刷题为主,方法可能就不那么详细,如果是新题会详细过程,其他的详细过程可以看22的试题 目录 2021年全国职业院校…

【LeetCode】Day210-二叉搜索树的后序遍历序列

题目 剑指 Offer 33. 二叉搜索树的后序遍历序列【中等】 题解 二叉搜索树性质&#xff1a;左<根&#xff0c;右>根 后序遍历序&#xff1a;左右根 递归分治 利用递归求解&#xff0c;[ i,j ]区间中找到第一个比根节点大的元素&#xff0c;下标为m&#xff0c;则[i,m…