Spring Boot 中使用 Resilience4j 实现弹性微服务的简单了解
1. 引言
在微服务架构中,服务的弹性是非常重要的。Resilience4j 是一个轻量级的容错库,专为函数式编程设计,提供了断路器、重试、舱壁、限流器和限时器等功能。
这里不做过多演示,只是查看一下官方案例并换成maven构建相关展示;
2.配置
spring:application.name: resilience4j-demojackson.serialization.indent_output: true # 格式化输出jsonserver:port: 9080management.endpoints.web.exposure.include: '*' # 暴露所有端点
management.endpoint.health.show-details: always # 显示详细健康信息management.health.diskspace.enabled: false # 关闭磁盘空间健康检查
management.health.db.enabled: false # 关闭数据库健康检查
management.health.circuitbreakers.enabled: true # 开启断路器健康检查
management.health.conditions.enabled: false # 关闭条件健康检查
management.health.ratelimiters.enabled: false # 关闭限流器健康检查info:name: ${spring.application.name}description: resilience4j demoenvironment: ${spring.profiles.active}version: 0.0.1management.metrics.tags.application: ${spring.application.name} # 添加自定义标签
management.metrics.distribution.percentiles-histogram.http.server.requests: true # 开启http请求统计
management.metrics.distribution.percentiles-histogram.resilience4j.circuitbreaker.calls: true # 开启断路器统计#resilience4j.circuitbreaker.metrics.use_legacy_binder: true # 使用旧版绑定器resilience4j.circuitbreaker: # 断路器配置configs:default:registerHealthIndicator: true # 开启健康检查slidingWindowSize: 10 # 滑动窗口大小minimumNumberOfCalls: 5 # 最小调用次数permittedNumberOfCallsInHalfOpenState: 3 # 半开状态最大调用次数automaticTransitionFromOpenToHalfOpenEnabled: true # 自动切换到半开状态waitDurationInOpenState: 5s # 半开状态等待时间failureRateThreshold: 50 # 失败率阈值eventConsumerBufferSize: 10 # 事件消费者缓冲区大小recordExceptions: # 记录异常- org.springframework.web.client.HttpServerErrorException # http服务端错误- java.util.concurrent.TimeoutException # 超时异常- java.io.IOException # IO异常ignoreExceptions: # 忽略异常- io.github.robwin.exception.BusinessException # 业务异常shared: # 共享配置slidingWindowSize: 100 # 滑动窗口大小permittedNumberOfCallsInHalfOpenState: 30 # 半开状态最大调用次数waitDurationInOpenState: 1s # 半开状态等待时间failureRateThreshold: 50 # 失败率阈值eventConsumerBufferSize: 10 # 事件消费者缓冲区大小ignoreExceptions: # 忽略异常- io.github.robwin.exception.BusinessException # 业务异常instances: # 实例配置backendA: # 配置 backendA 实例baseConfig: default # 使用 default 配置backendB: # 配置 backendB 实例registerHealthIndicator: true # 开启健康检查slidingWindowSize: 10 # 滑动窗口大小minimumNumberOfCalls: 10 # 最小调用次数permittedNumberOfCallsInHalfOpenState: 3 # 半开状态最大调用次数waitDurationInOpenState: 5s # 半开状态等待时间failureRateThreshold: 50 # 失败率阈值eventConsumerBufferSize: 10 # 事件消费者缓冲区大小recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate # 记录异常
resilience4j.retry: # 重试配置configs:default:maxAttempts: 3 # 最大重试次数waitDuration: 100 # 重试间隔时间 (ms)retryExceptions: # 记录异常- org.springframework.web.client.HttpServerErrorException # http服务端错误- java.util.concurrent.TimeoutException # 超时异常- java.io.IOException # IO异常ignoreExceptions: # 忽略异常- io.github.robwin.exception.BusinessException # 业务异常instances:backendA: # 配置 backendA 实例baseConfig: default # 使用 default 配置backendB: # 配置 backendB 实例baseConfig: default # 使用 default 配置
resilience4j.bulkhead: # 舱壁 批量请求配置configs:default:maxConcurrentCalls: 100 # 最大并发调用数instances:backendA: # 配置 backendA 实例maxConcurrentCalls: 10 # 最大并发调用数backendB:maxWaitDuration: 10ms # 最大等待时间maxConcurrentCalls: 20 # 最大并发调用数resilience4j.thread-pool-bulkhead: # 线程池舱壁 批量请求配置configs:default:maxThreadPoolSize: 4 # 最大线程池大小coreThreadPoolSize: 2 # 核心线程池大小queueCapacity: 2 # 队列容量instances:backendA:baseConfig: default # 使用 default 配置backendB:maxThreadPoolSize: 1 # 覆盖默认配置,最大线程池大小coreThreadPoolSize: 1 # 覆盖默认配置,核心线程池大小queueCapacity: 1 # 覆盖默认配置,队列容量resilience4j.ratelimiter: # 限流器配置configs:default:registerHealthIndicator: false # 关闭健康检查limitForPeriod: 10 # 每个周期内的请求限制数limitRefreshPeriod: 1s # 周期刷新时间,即每秒刷新一次timeoutDuration: 0 # 请求超时时间,0表示不超时eventConsumerBufferSize: 100 # 事件消费者缓冲区大小instances:backendA:baseConfig: default # 使用默认配置backendB:limitForPeriod: 6 # 每个周期内的请求限制数limitRefreshPeriod: 500ms # 周期刷新时间,即每500毫秒刷新一次timeoutDuration: 3s # 请求超时时间,3秒resilience4j.timelimiter: # 限时器配置configs:default:cancelRunningFuture: false # 是否取消正在运行的FuturetimeoutDuration: 2s # 超时时间,2秒instances:backendA:baseConfig: default # 使用默认配置backendB:baseConfig: default # 使用默认配置
3.依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><resilience4j.version>2.0.2</resilience4j.version></properties><dependencies><!-- Spring Boot Starters --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- Resilience4j --><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>${resilience4j.version}</version></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-all</artifactId><version>${resilience4j.version}</version></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-reactor</artifactId><version>${resilience4j.version}</version></dependency><!-- Micrometer Prometheus --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><!-- Chaos Monkey for Spring Boot --><dependency><groupId>de.codecentric</groupId><artifactId>chaos-monkey-spring-boot</artifactId><version>2.7.0</version></dependency><!-- Vavr Jackson --><dependency><groupId>io.vavr</groupId><artifactId>vavr-jackson</artifactId><version>0.10.3</version></dependency><!-- Test Dependencies --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId><version>3.4.22</version><scope>test</scope></dependency></dependencies>
这里正好用Prometheus和Grafana看看效果
4 总结
通过本文的介绍,你应该已经了解了如何在 Spring Boot 项目中配置和使用 Resilience4j 来实现断路器、重试、舱壁、限流器和限时器等功能,Resilience4j 提供了丰富的配置选项和灵活的使用方式,帮助你构建弹性的微服务。
相关文章:

Spring Boot 中使用 Resilience4j 实现弹性微服务的简单了解
1. 引言 在微服务架构中,服务的弹性是非常重要的。Resilience4j 是一个轻量级的容错库,专为函数式编程设计,提供了断路器、重试、舱壁、限流器和限时器等功能。 这里不做过多演示,只是查看一下官方案例并换成maven构建相关展示&…...
Hadoop3:MR程序压测实验
一、环境要求 内存:128G CPU:32C 磁盘:8T 注:一个虚拟机不超过150G磁盘尽量不要执行这段代码 二、案例 1、需求 使用Sort程序评测MapReduce 2、操作步骤 1、使用RandomWriter来产生随机数,每个节点运行10个Map任…...

初学者如何通过建立个人博客盈利
建立个人博客不仅能让你在网上表达自己,还能与他人建立联系。通过博客,可以创建自己的空间,分享想法和故事,并与有相似兴趣和经历的人交流。 本文将向你展示如何通过建立个人博客来实现盈利。你将学习如何选择博客主题、挑选合适…...
构建稳健性:如何在Gradle中配置构建失败时的行为
构建稳健性:如何在Gradle中配置构建失败时的行为 在软件开发过程中,构建失败是不可避免的。然而,如何优雅地处理构建失败并从中恢复,是提高开发效率和软件质量的关键。Gradle,作为一款强大的构建工具,提供…...
大语言模型-基础及拓展应用
一、基础模型 1、Transformer 2、bert 3、gpt 二、大语言模型 三、句子向量 四、文档解析 1、通用解析 2、docx解析 3、 pdf解析 4、pptx解析 五、向量数据库...

STM32使用Wifi连接阿里云
目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下,如何使用阿里云物联网平台,创建一个简单的远程控制小灯示例。 完整工程&a…...

2024.7.16日 最新版 docker cuda container tookit下载!
nvidia官方指导 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 其实就是这几个命令,但是有墙: curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/shar…...

打印室预约小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,附近打印店管理,文件打印管理,当前预约管理,预约历史管理,打印记录管理 开发系统:Windows 架构模式:SSM JD…...

Android音视频—OpenGL 与OpenGL ES简述,渲染视频到界面基本流程
文章目录 OpenGL 简述特点和功能主要组件OpenGL ES当前状态 OpenGL ES 在 Android 上进行视频帧渲染总体流程 OpenGL 简述 OpenGL(Open Graphics Library)是一个跨平台的、语言无关的应用程序编程接口(API),用于开发生…...

Vscode中Github copilot插件无法使用(出现感叹号)解决方案
1、击扩展或ctrl shift x 2、搜索查询或翻找到Github compilot 3、点击插件并再左侧点击登录github 点击Sign up for a ... 4、跳转至github登录页,输入令牌完成登陆后返回VScode 5、插件可以正常使用...
Spring-cloud-openfeign-@FeignClient中的configuration属性
FeignClient注解中的configuration属性就是设置相关配置,但是这个属性写的非常的不好,而且在它的注释中也没有写全,所以本文记录一下,当我们的代码如下时: FeignClient(name "xxx", configuration Abc.cl…...

实验七:图像的复原处理
一、实验目的 熟悉常见的噪声及其概率密度函数。熟悉在实际应用中比较重要的图像复原技术,会对退化图像进行复原处理。二、实验原理 1. 图像复原技术,说简单点,同图像增强那样,是为了以某种预定义的方式来改进图像。在具体操作过程中用流程图表示,其过程就如下面所示: 2…...
前端面试题日常练-day94 【Less】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 在Less中,以下哪个功能用于处理文本换行? a) wrap-text() b) word-wrap() c) text-wrap() d) line-break() Less中的Variables是用来做什么的? a) 控制元素位置 b)…...
c 语言 中 是否有 unsigned 安;这种写法?
你提到的结构体定义使用了unsigned这种没有完全限定类型的写法,在C语言中,这种语法通常会被解释为unsigned int。这是因为在C语言中,unsigned是unsigned int的缩写形式。 下面是你的结构体定义以及解释: struct exec {unsigned …...
Hive第三天
1. 后台启动HIVE的JDBC连接 0 表示标准输入 1 表示标准输出 2 表示标准错误输出 nohup 表示挂起 最后的 & 表示 后台启动 nohup hive -service hiveserver2 > /usr/local/soft/hive-3.1.2/log/hiveserver2.log 2>&1 & jps 查看 Runj…...

【C++】模版初阶以及STL的简介
个人主页~ 模版及STL 一、模版初阶1、泛型编程2、函数模版(1)概念(2)函数模版格式(3)函数模版的原理(4)函数模版的实例化①显式实例化②隐式实例化 (5)模版参…...

51单片机学习(4)
一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程,模块化编程之后要对其进行注释,以便之后使用模块化函数,对模块化.c文件中的每一个函数进行注释。 注意:一个函数不能既在主函数又在中断函数中 模式1最常用…...

3D问界—MAYA制作铁丝栅栏(透明贴图法)
当然,如果想通过建立模型法来实现铁丝栅栏的效果,也不是不行,可以找一下栅栏建模教程。本篇文章主要是记录一下如何使用透明贴图来实现创建铁丝栅栏,主要应用于场景建模,比如游戏场景、建筑场景等大环境,不…...

编译器对C++23的支持程度
详见这里...

k8s核心操作_存储抽象_K8S中使用Secret功能来存储密码_使用免密拉取镜像_k8s核心实战总结---分布式云原生部署架构搭建033
注意在看的时候一定要把 dxxxx中的xxxx换成--o----c----k----e----r 然后我们再来看一个k8s中的secret的功能,这个功能 用来存储密码的,configMap是用来存配置的 比如我们有个pod,他的镜像,如果是需要密码的,那么 我们现在是从公共仓库拉取的,如果我们从私有仓库拉取,有密码…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...