【Spring Cloud】 Ribbon、Feign 以及 Hystrix 的关系
在Spring Cloud中Ribbon、Feign、Hystrix,它们三者之间在处理微服务调用的关系是什么?
微服务之间的互相调用可以通过 Feign 进行声明式调用,在这个服务调用过程中 Feign 会通过 Ribbon 从服务注册中心获取目标服务的服务器地址列表,然后在网络请求的过程中 Ribbon 就会将请求以负载均衡的方式打到不同服务器上,从而实现 Spring Cloud 微服务架构中最关键的功能,即服务发现及客户端负载均衡调用。
微服务在互相调用的过程中,为了防止某个微服务的故障消耗掉整个系统所有微服务的连接资源,所以在微服务调用的过程中,我们会实施针对重点微服务的熔断逻辑。而要实现这个逻辑是通过 Hystrix 这个框架来实现的。
调用方会针对被调用微服务设置调用超时时间,一旦超时就会进入熔断逻辑,而这个故障指标信息也会返回给Hystrix组件,Hystrix组件会根据熔断情况判断被调微服务的故障情况从而打开熔断器,之后所有针对该微服务的请求就会直接进入熔断逻辑,直到被调微服务故障恢复,Hystrix断路器关闭为止。
三者的关系大致如下:
Feign、Ribbon 以及 Hystrix 的配置说明
Ribbon配置说明
Ribbon 的主要功能包括客户端负载均衡器及用于中间层通信的客户端。在基于Feign的微服务通信中无论是否开启Hystrix,Ribbon都是必不可少的,Ribbon的配置参数主要如下:
以上配置方式将对所有的微服务调用有效,如果想针对单独的微服务进行配置,使用“微服务名.ribbon”这样的配置方式即可,例如:
Feign配置说明
Feign是一款Java语言编写的HttpClient绑定器,在Spring Cloud微服务中用于实现微服务之间的声明式调用,Feign自身可以支持多种HttpClient工具包,例如 OkHttp 及 Apache HttpClient。其默认常见配置如下:
Hystrix配置说明
Hystrix 主要被用于实现实现微服务之间网络调用故障的熔断、过载保护及资源隔离等功能。
接下来我们就按照参数配置的类型对 Hystrix 中的常见配置做一个梳理。
1、线程隔离相关配置
Hystrix 具备的重要关键特性之一:它能够实现对第三方服务依赖的资源隔离,最常见的隔离方式是通过线程池资源的隔离来实现的,Hystrix 会为每个第三方服务依赖配置单独的线程池资源,从而避免对第三方服务依赖的请求占用应用主线程资源以免造成系统雪崩。
Hystrix中关于线程隔离相关的配置如下:
2、熔断器相关配置
熔断器是 Hystrix 最主要的功能,它开启和关闭的时机、灵敏度及准确性是 Hystrix 是否能够发挥重要的关键。
在 Hystrix 中与熔断器相关的几个配置如下:
3、Metrics(统计器)相关配置
Hystrix 是否正常工作,最主要的依赖就是根据捕获的调用指标信息来判断是否打开或者关闭熔断器,影响 Hystrix 行为很重要的因素就是以下 Hystrix 关于Metrics的配置。
Metrics 的配置中出现了两个比较频繁的概念:滑动窗口、桶,Hystrix的统计器就是由滑动窗口来实现的。
4、线程池相关配置
在前面提到过 Hystrix 实现对第三方服务依赖资源隔离最主要的方式就是通过线程池,而 Hystrix 内线程的使用是基于 Java 内置线程池的简单封装,通过以下 Hystrix 线程池参数我们可以控制执行 Hystrix 命令的线程池的行为。
具体如下:
Feign、Hystrix、Ribbon的超时配置关系
Feign、Hystrix、Ribbon 都有针对微服务超时的配置,而在开启熔断器功能后,这些超时配置会影响到熔断器及服务降级逻辑的行为,那么它们之间超时的配置有什么关系呢?
在Spring Cloud中使用 Feign 进行微服务调用分为两层:Ribbon 的调用及 Hystrix 的调用。所以 Feign 的超时时间就是 Ribbon 和 Hystrix 超时时间的结合,而如果不启用 Hystrix, 则 Ribbon 的超时时间就是 Feign 的超时时间配置,Feign 自身的配置会被覆盖。
而如果开启了 Hystrix,那么 Ribbon 的超时时间配置与 Hystrix 的超时时间配置则存在依赖关系,因为涉及到 Ribbon 的重试机制,所以一般情况下都是Ribbon 的超时时间小于 Hystrix 的超时时间,否则会出现以下错误:
Ribbon 和 Hystrix 的超时时间配置的关系如下:
而Ribbon的重试次数的计算方式为:
以我们文中的 Ribbon 配置为例子, Ribbon 的重试次数=1+(1+1+1)*(30000+10000),所以 Hystrix 的超时配置应该>=160000毫秒。在 Ribbon 超时但 Hystrix 没有超时的情况下,Ribbon 便会采取重试机制;而重试期间如果时间超过了 Hystrix 的超时配置则会立即被熔断(fallback)。
如果不配置 Ribbon 的重试次数,则 Ribbon 默认会重试一次,加上第一次调用 Ribbon 的重试次数为2次,以上述配置为例 Hystrix 超时时间配置为2*40000=80000,大家一般不会主动配置Ribbon的重试次数。
以上超时配置的值只是示范,大家根据实际情况设置即可!
参考资料: https://github.com/Netflix/Hystrix/wiki/Configuration https://www.cnblogs.com/throwable/p/11961016.html
原文链接:https://piterjia.github.io/2020/06/09/ribbon-feign-hystrix-relation/
版权声明:
作者:白纸画
链接:https://www.fanyicloud.cn/article-29.fan
来源:白纸画的博客
文章版权归作者所有,未经允许请勿转载。

全部评论