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

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

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

设置Maven

 

添加依赖如下:

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

熔断器

 

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

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

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

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

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

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

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

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

熔断器状态及设置

 

熔断器有三种可能状态:

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

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

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

可以做以下设置:

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

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

  • 熔断器半开或者闭合时,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,由方圆翻译。

Hystrix已经停止开发,官方推荐替代项目Resilience4j的更多相关文章

  1. Android开发——官方推荐使用DialogFragment替换AlertDialog

    )比如当屏幕旋转时,AlertDialog会消失,更不会保存如EditText上的文字,如果处理不当很可能引发异常,因为Activity销毁前不允许对话框未关闭.而DialogFragment对话框会 ...

  2. Hystrix 停止开发。。。Spring Cloud 何去何从?

    栈长得到消息,Hystrix 停止开发了... 大家如果有对 Hystrix 不清楚的,请看下这篇文章:分布式服务防雪崩熔断器,Hystrix理论+实战. 来看下 Hystrix 停止开发官宣: ht ...

  3. iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频

    iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸 50mm*60mm 高度 核心板连接器组合高度1.5mm PCB层数 6层PCB沉金设计 4418 CPU ARM ...

  4. PHPStorm.WebStrom等系列官方开发工具配置本地项目与运程服务器同步

    PHPStorm.WebStrom配置本地项目与运程服务器同步 说明:PHPStorm.WebStrom等官方的系统开发工具配置本地项目与运程服务器同步的方法都基本一致没有,几乎没有什么不同之处,我们 ...

  5. 温故知新,微软官方推荐的Visual Studio源代码管理之Git Ignore清单,开启新项目必备宝书

    什么是Git Ignore清单 https://git-scm.com/docs/gitignore 简单来说,在Git进行源代码管理中,我们可以通过建立.gitignore来实现一个忽略的黑名单管理 ...

  6. ⏰ Moment.js 宣布停止开发,现在该用什么?

    本文整理自 Monent.js 官方英文公告 https://momentjs.com/docs/#/-project-status/ Moment.js 宣布停止开发,进入维护状态. 这是一个大而全 ...

  7. springcloud(十三):Eureka 2.X 停止开发,但注册中心还有更多选择:Consul 使用详解

    在上个月我们知道 Eureka 2.X 遇到困难停止开发了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件, ...

  8. Python | Pipenv官方推荐的python包管理工具

    原文地址:https://cloud.tencent.com/developer/article/1355672 Pipenv - 官方推荐的的python包管理工具. Pipenv是一款旨在将所有包 ...

  9. SVN库迁移整理方法----官方推荐方式

    以下是subversion官方推荐的备份方式. 关闭所有运行的进程,并确认没有程序在访问存储库(如 httpd.svnserve 或本地用户在直接访问). 备份svn存储库 #压缩备份 svnadmi ...

随机推荐

  1. Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中

    如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...

  2. Putty出现 Network error:Software caused connection abort

    使用centos7.5 用Putty连接使用没多久就会出现 Network error:Software caused connection abort #修改sshd配置文件.修改3项配置即可 vi ...

  3. poj1942 Paths on a Grid(无mod大组合数)

    poj1942 Paths on a Grid 题意:给定一个长m高n$(n,m \in unsigned 32-bit)$的矩形,问有几种走法.$n=m=0$时终止. 显然的$C(m+n,n)$ 但 ...

  4. Yii关键概念

    basic/ 应用根目录 composer.json Composer 配置文件, 描述包信息 config/ 包含应用配置及其它配置 console.php 控制台应用配置信息 web.php We ...

  5. 《WAP》第一次作业:团队亮相

    一.队名:WAP! 二.团队成员组长 组员 : 201571030302/杜有海 201571030327/乌勒扎 201571030304/郝明宇 201571030318/马麒 组长: 20157 ...

  6. Android-----------广告图片轮播控件

    Banner广告图片轮播控件,支持无限循环和多种主题,可以灵活设置轮播样式.动画.轮播和切换时间.位置.图片加载框架等! 很多Android APP中都有广告栏,我也用过很多次了,特来写一篇博文. 先 ...

  7. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  8. APP的六种loading加载样式,全在这...

    今天这篇文章是给大家分享的loading加载的设计,文章里面会有一些实例在这分享给大家! 大多数App都要与服务器进行数据的交换,App向服务器发出数据请求,服务器接收到请求之后向App传输相应数据, ...

  9. POJ 3279 Fliptile 状态压缩,思路 难度:2

    http://poj.org/problem?id=3279 明显,每一位上只需要是0或者1, 遍历第一行的所有取值可能,(1<<15,时间足够)对每种取值可能: 对于第0-n-2行,因为 ...

  10. sgu 142. Keyword 暴力,hash 难度:0

    142. Keyword time limit per test: 0.5 sec. memory limit per test: 16384 KB Kevin has invented a new ...