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

随着微服务的流行,熔断做为其中一项很重要的技术也广为人知。当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会由于持续过负荷而宕机。本文介绍了新一代熔断器Resilience4j如何使用。git

 

 

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


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

 

设置Maven

 

添加依赖以下:后端

这里仅仅添加了熔断器模块,其余模块能够点击这里[1]。缓存

 

熔断器

 

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

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

咱们看看resilience4j如何作到这一点。

首先须要定义使用的设置,咱们先使用默认设置:服务器

固然你也能够自定义一些参数:并发

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

而后咱们建立一个熔断器对象,并调用远程服务:框架

经过junit进行测试,咱们会调用服务10次,能够验证服务至少调用5次,若是有20%的失败的状况下,会中止调用。maven

 

熔断器状态及设置

 

熔断器有三种可能状态:模块化

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

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

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

能够作如下设置:

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

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

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

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

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

 

限流器

 

这里须要引入resilience4j-ratelimiter[2]依赖。能够容许限制对某些服务的访问。

全部对decorateFunction的调用都符合rate limiter.

咱们能够配置参数以下:

  • limit刷新周期

  • 刷新周期的权限限制

  • 默认等待权限持续时间

 

舱壁隔离

 

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

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

为了测试,咱们能够调用一个mock服务的方法。这种状况下,咱们就不容许其余调用:

咱们能够作以下设置:

  • 容许的最大并行数

  • 线程等待的最大时间

 

重试

 

须要引入resilience4j-retry[4]库。能够在调用失败后自动重试:

如今咱们模拟远程调用失败,并确认自动重试:

咱们能够作以下设置:

  • 最大尝试数

  • 重试前等待时间

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

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

 

缓存

 

cache模块须要引入resilience4j-cache[5]依赖。初始化代码不同凡响:

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

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

 

限时器

 

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

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

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

能够和熔断器组合使用:

 

附加模块

 

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,由方圆翻译。

相关文章
相关标签/搜索