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 提供了丰富的配置选项和灵活的使用方式,帮助你构建弹性的微服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246991.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

DNS查询过程

DNS&#xff08;域名系统&#xff0c;Domain Name System&#xff09;是一个用于将域名和IP地址相互映射的系统。当你在浏览器中输入一个网址时&#xff0c;浏览器会通过DNS查询过程来找到对应的IP地址&#xff0c;以便能够连接到目标服务器。其查询过程一般通过以下步骤&#…

Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152位支持,保障网络安全。同时支持MAC地址认证、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全机制,…

【Flowable | 第四篇】flowable工作流多任务实例节点实现会签/或签

文章目录 5.flowable工作流多任务实例节点实现会签/或签5.1会签/或签概念5.2多实例配置说明5.3会签例子5.3.1用户候选人配置5.3.2多实例配置5.3.3执行监听器配置5.3.5测试 5.flowable工作流多任务实例节点实现会签/或签 5.1会签/或签概念 我们在本篇中&#xff0c;将使用多任…

【JavaEE】synchronized原理详解

本文使用的是JDK1.8 目录 引言 Java对象在JVM的结构 对象头 Mark Word Monitor Owner EntryList WaitSet 加锁过程 锁消除 偏向锁 偏向锁使用 重偏向 撤销偏向 轻量级锁 重量级锁 自旋优化 引言 对于synchronized原理讲解之前&#xff0c;我们需要知道Java对象…

C#学习

C#学习 1.B站丑萌气质狗C#的循环-判断泛型错误处理面向对象static的使用定义showInfo类和Hero类 在这里插入图片描述 然后在该解决方案add新建一个类库&#xff0c;点击rebuild&#xff0c;会在bin文件夹下生成.dll文件 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

SSE(Server Sent Event)实战(3)- Spring Web Flux 实现

上篇博客 SSE&#xff08;Server Sent Event&#xff09;实战&#xff08;2&#xff09;- Spring MVC 实现&#xff0c;我们用 Spring MVC 实现了简单的消息推送&#xff0c;并且留下了两个问题&#xff0c;这篇博客&#xff0c;我们用 Spring Web Flux 实现&#xff0c;并且看…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第二篇 Linux系统编程篇-第三十一章 文件IO和标准IO

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

进程的优先级与命令行参数

一、进程的优先级 1、理解 制定一个进程获取某种资源的先后顺序。 在Linux中数字越小优先级越高。 2、优先级的意义 进程访问资源始终是有限的&#xff0c;系统中的进程都是很多的。 操作系统关于调度和优先级规则 分时操作系统&#xff0c;基本公平。如果进程长时间不被…

Study--Oracle-07-ASM自动存储管理(二)

一、ASM安装准备条件 1、ASM支持存储类型 本地祼设备(本地的磁盘和分区) 网络附加存储(NAS) 存储区域网络(SAN) 2、ASM使用本地裸设备,要点: 已经被挂载到操作系统上或者已经做了分区 映射裸设备为文件名 设置正确的权限(针对grid用户和asmadmin组,权限为660) 二、OR…

玄机-第一章 应急响应-webshell查杀

文章目录 前言简介应急开始准备工作步骤 1步骤 2步骤 3步骤 4 总结 前言 作者是个垃圾&#xff0c;第一次玩玄机太紧张了&#xff0c;不知道flag是啥样找了半天&#xff0c;第二次开靶机多次尝试才知道格式。争取下次一次过。 简介 靶机账号密码 root xjwebshell 1.黑客webshel…

网络割接方案通用模板

第一章 项目概述 1.1 编写目的 为规范“十三五”以来&#xff0c;随着移动互联新技术的发展以及我国政府职能的不断转变&#xff0c; 我国的政法网络进入新的发展阶段&#xff0c;跨地域、跨部门、跨系统的信息共享、业务 协同以及智慧政务等成为了各地电子政务的重点建设内容。…

【数学建模】——多领域资源优化中的创新应用-六大经典问题解答

目录 题目1&#xff1a;截取条材 题目 1.1问题描述 1.2 数学模型 1.3 求解 1.4 解答 题目2&#xff1a;商店进货销售计划 题目 2.1 问题描述 2.2 数学模型 2.3 求解 2.4 解答 题目3&#xff1a;货船装载问题 题目 3.1问题重述 3.2 数学模型 3.3 求解 3.4 解…

MATLAB-Simulink模型加密

1、封装子系统 假如已经是子系统&#xff0c;需要确认子系统是否为虚拟子系统如果是虚拟子系统需要将虚拟子系统设置为非虚拟子系统也就是原子子系统。 右击子系统模块&#xff0c;选择Block Parameter->勾选Treat as atomic unit 设置仿真步长 2、将设置好的子系统转换为…

【Outlook】从Outlook新版回归经典版全攻略

引言 在微软宣布计划于2024年底淘汰邮件应用&#xff08;Mail app&#xff09;之后&#xff0c;许多用户发现新版Outlook应用&#xff08;Outlook (new)&#xff09;在他们的Windows 11/10系统上自动启动。如果您更倾向于使用经典版Outlook&#xff08;Outlook (classic)&…

实验丰富、原创改进!|多策略改进蜣螂优化算法(MATLAB)

本文内容来源于本人公众号&#xff1a;KAU的云实验台&#xff0c;更新内容&#xff1a;智能优化算法及其改进应用。 本文核心内容&#xff1a; 新颖的多策略改进蜣螂优化算法 对比算法包括&#xff1a;高引用/新发布/经典/其他DBO变体&#xff08;共11种&#xff09; 实验设计…

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com) 第1讲-课程目标_哔哩哔哩_bilibili Golang三色标记GC混合写屏障 Go V1.3之前的标记清除&#xff08;mark and sweep) 垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world) 图的遍历&#xff1f;可达性分…

ArgMed-Agents:通过多个智能体论证方案增强大模型,进行可解释的临床决策推理

ArgMed-Agents&#xff1a;通过多个智能体论证方案增强大模型&#xff0c;进行可解释的临床决策推理 提出背景ArgMed-Agents 框架目的解法拆解逻辑链 临床讨论的论证方案&#xff08;ASCD&#xff09;论证方案用于决策&#xff08;ASDM&#xff09;论证方案用于副作用&#xff…

python课设——宾馆管理系统

python课设——宾馆管理系统 数据库课设-宾馆管理系统-python3.7pyqt5 简介 大二数据库课程设计&#xff08;3-4天工作量&#xff09;的项目&#xff0c;登录界面的ui设计参考了他人成果&#xff0c;其余ui以及所有后端部分全部独立完成&#xff0c;详细功能见功能模块图使用…

【ffmpeg命令】制作一个属于你自己的动图表情包

文章目录 前言如何制作一个动态表情包制作动图表情包转换分辨率减少帧率截取主要内容转换为gif动图去除水印 最终结果总结 前言 在数字时代&#xff0c;动图表情包已经成为我们日常交流的重要组成部分。它们富有表现力&#xff0c;能够传达出我们无法用语言表述的情感和信息。…

LangChain-v0.2 Build an Agent 构建代理

语言模型本身不能采取行动&#xff0c;它们只是输出文本。LangChain的一个重要用例是创建代理。代理是使用LLM作为推理引擎来确定要采取哪些行动&#xff0c;以及传递哪些输入的系统。执行操作后&#xff0c;可以将结果反馈到LLM中&#xff0c;以确定是否需要更多操作&#xff…