博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hystrix已经停止开发,官方推荐替代项目Resilience4j简介
阅读量:6416 次
发布时间:2019-06-23

本文共 2637 字,大约阅读时间需要 8 分钟。

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

译者注:Hystrix官方已经停止开发了,Hystrix官方推荐使用新一代熔断器作为Resilience4j。作为新一代的熔断器,Resilience4j有很多优势,比如依赖少,模块化程度较好等优势。本文是关于resilience4j的初学者指南。

resilience4j是受Hystrix启发而做的熔断器,通过管理远程调用的容错处理来帮助实现一个健壮的系统。resilience4j提供了更好用的API,并且提供了很多其他功能比如Rate Limiter(限流器),Bulkhead(舱壁隔离)。

设置Maven

添加依赖如下:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

这里仅仅添加了熔断器模块,其他模块可以点击这里[1]。

熔断器

使用这部分功能,需要引入上文所述的依赖。熔断器模式可以帮助我们在远程服务出故障时防止故障级联。

在多次请求失败后,我们就认为服务不可用/超载,并且对之后的请求进行短路处理,这样我们就能节约系统资源。

我们看看resilience4j如何做到这一点。

首先需要定义使用的设置,我们先使用默认设置:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

当然你也可以自定义一些参数:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

这里我们设置ratethreshold为20%,最小5次重试。

然后我们创建一个熔断器对象,并调用远程服务:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

通过junit进行测试,我们会调用服务10次,可以验证服务至少调用5次,如果有20%的失败的情况下,会停止调用。

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

熔断器状态及设置

熔断器有三种可能状态:

  • 关闭— 服务正常,不需要进行短路

  • 打开— 远程服务宕机,所有请求都短路

  • 半开— 进入打开状态一段时间后,熔断器允许检查远程服务是否恢复

可以做以下设置:

  • 熔断器进入打开状态的阈值

  • 等待时间,即熔断器进入打开状态到半开状态需要等待的时间

  • 熔断器半开或者闭合时,ring buffer的大小

  • 处理自定义事件的监听器

  • 自定义谓词,用于评估异常是否应算作故障,从而提高故障率

限流器

这里需要引入resilience4j-ratelimiter[2]依赖。可以允许限制对某些服务的访问。

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

所有对decorateFunction的调用都符合rate limiter.

我们可以配置参数如下:

  • limit刷新周期

  • 刷新周期的权限限制

  • 默认等待权限持续时间

舱壁隔离

这里需要引入resilience4j-bulkhead[3]依赖。可以限制对特定服务的并发调用数。

让我们看一个使用Bulkhead API配置并发调用的示例:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

为了测试,我们可以调用一个mock服务的方法。这种情况下,我们就不允许其他调用:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

我们可以做如下设置:

  • 允许的最大并行数

  • 线程等待的最大时间

重试

需要引入resilience4j-retry[4]库。可以在调用失败后自动重试:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

现在我们模拟远程调用失败,并确认自动重试:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

我们可以做如下设置:

  • 最大尝试数

  • 重试前等待时间

  • 自定义函数,用于修改故障后的等待间隔。

  • 自定义谓词,用于评估异常是否应重试

缓存

cache模块需要引入resilience4j-cache[5]依赖。初始化代码与众不同:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

这里的缓存是通过使用的JSR-107 Cache实现完成的,Resilience4j提供了使用缓存的方法。

请注意,没有用于装饰功能的API(如Cache.decorateFunction(Function)),API仅支持Supplier和Callable类型。

限时器

该模块需要引入resilience4j-timelimiter[6]依赖。可以使用TimeLimiter限制调用远程服务所花费的时间。

我们设置超时时间为1毫秒的TimeLimiter:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

使用Future.get验证是否如预期超时:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

可以和熔断器组合使用:

Hystrix已经停止开发,官方推荐替代项目Resilience4j简介

附加模块

Resilience4j还提供了许多附加模块,可以简化与流行框架和库的集成。

一些比较知名的集成是:

  • Spring Boot - resilience4j-spring-boot模块

  • Ratpack - resilience4j-ratpack模块

  • Retrofit - resilience4j-Retrofit模块

  • Vertx - resilience4j-vertx模块

  • Dropwizard - resilience4j-metrics模块

  • Prometheus - resilience4j-prometheus模块

结论

在本文中,我们了解了Resilience4j库的不同方面,并学习了如何使用它来解决服务器间通信中的各种容错问题。源代码和更多示例可以在这里[5]找到。

文中链接:

[1]https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22io.github.resilience4j%22

[2]https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22resilience4j-ratelimiter%22

[3]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-bulkhead

[4]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-retry

[5]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-cache

[6]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-timelimiter

[7]https://github.com/eugenp/tutorials/tree/master/libraries

原文地址:

https://www.baeldung.com/resilience4j

本文作者baeldung,由方圆翻译。转载本文请注明出处,欢迎更多小伙伴加入翻译及投稿文章的行列,详情请戳公众号菜单「联系我们」。

参考阅读:

技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。转载请注明来自高可用架构「ArchNotes」微信公众号及包含以下二维码。

高可用架构

改变互联网的构建方式

长按二维码 关注「高可用架构」公众号

你可能感兴趣的文章
Android触摸事件流程剖析
查看>>
查看Linux系统的平均负载
查看>>
git基础知识
查看>>
oracle数据库常见故障情况数据恢复分析
查看>>
华为交换机访问控制策略
查看>>
在centos7上手动安装二进制mariadb
查看>>
【数据结构与算法】数组应用4:多项式计算Java版
查看>>
Netty中定长解码器的使用
查看>>
Python练习5
查看>>
使用Ant将java项目打包上传至服务
查看>>
Log4j日志操作详细用法
查看>>
bindService
查看>>
学java一个星期感悟
查看>>
早睡早起
查看>>
oracle g11.2 sys用户登录
查看>>
我的友情链接
查看>>
“安装程序无法定位现有系统分区,也无法创建新的系统分区”最简单解决方法...
查看>>
jvm gc情况查看
查看>>
sublime2的html自动排版快捷键ctrl+alt+f不能使用解决方法
查看>>
Allwinner A20开发相关问题汇总
查看>>