当前位置: 首页 > news >正文

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. 引言 在微服务架构中&#xff0c;服务的弹性是非常重要的。Resilience4j 是一个轻量级的容错库&#xff0c;专为函数式编程设计&#xff0c;提供了断路器、重试、舱壁、限流器和限时器等功能。 这里不做过多演示&#xff0c;只是查看一下官方案例并换成maven构建相关展示&…...

Hadoop3:MR程序压测实验

一、环境要求 内存&#xff1a;128G CPU&#xff1a;32C 磁盘&#xff1a;8T 注&#xff1a;一个虚拟机不超过150G磁盘尽量不要执行这段代码 二、案例 1、需求 使用Sort程序评测MapReduce 2、操作步骤 1、使用RandomWriter来产生随机数&#xff0c;每个节点运行10个Map任…...

初学者如何通过建立个人博客盈利

建立个人博客不仅能让你在网上表达自己&#xff0c;还能与他人建立联系。通过博客&#xff0c;可以创建自己的空间&#xff0c;分享想法和故事&#xff0c;并与有相似兴趣和经历的人交流。 本文将向你展示如何通过建立个人博客来实现盈利。你将学习如何选择博客主题、挑选合适…...

构建稳健性:如何在Gradle中配置构建失败时的行为

构建稳健性&#xff1a;如何在Gradle中配置构建失败时的行为 在软件开发过程中&#xff0c;构建失败是不可避免的。然而&#xff0c;如何优雅地处理构建失败并从中恢复&#xff0c;是提高开发效率和软件质量的关键。Gradle&#xff0c;作为一款强大的构建工具&#xff0c;提供…...

大语言模型-基础及拓展应用

一、基础模型 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代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…...

2024.7.16日 最新版 docker cuda container tookit下载!

nvidia官方指导 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 其实就是这几个命令&#xff0c;但是有墙&#xff1a; curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/shar…...

打印室预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;附近打印店管理&#xff0c;文件打印管理&#xff0c;当前预约管理&#xff0c;预约历史管理&#xff0c;打印记录管理 开发系统&#xff1a;Windows 架构模式&#xff1a;SSM JD…...

Android音视频—OpenGL 与OpenGL ES简述,渲染视频到界面基本流程

文章目录 OpenGL 简述特点和功能主要组件OpenGL ES当前状态 OpenGL ES 在 Android 上进行视频帧渲染总体流程 OpenGL 简述 OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的、语言无关的应用程序编程接口&#xff08;API&#xff09;&#xff0c;用于开发生…...

Vscode中Github copilot插件无法使用(出现感叹号)解决方案

1、击扩展或ctrl shift x ​​​​​​​ 2、搜索查询或翻找到Github compilot 3、点击插件并再左侧点击登录github 点击Sign up for a ... 4、跳转至github登录页&#xff0c;输入令牌完成登陆后返回VScode 5、插件可以正常使用...

Spring-cloud-openfeign-@FeignClient中的configuration属性

FeignClient注解中的configuration属性就是设置相关配置&#xff0c;但是这个属性写的非常的不好&#xff0c;而且在它的注释中也没有写全&#xff0c;所以本文记录一下&#xff0c;当我们的代码如下时&#xff1a; FeignClient(name "xxx", configuration Abc.cl…...

实验七:图像的复原处理

一、实验目的 熟悉常见的噪声及其概率密度函数。熟悉在实际应用中比较重要的图像复原技术,会对退化图像进行复原处理。二、实验原理 1. 图像复原技术,说简单点,同图像增强那样,是为了以某种预定义的方式来改进图像。在具体操作过程中用流程图表示,其过程就如下面所示: 2…...

前端面试题日常练-day94 【Less】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 在Less中&#xff0c;以下哪个功能用于处理文本换行&#xff1f; a) wrap-text() b) word-wrap() c) text-wrap() d) line-break() Less中的Variables是用来做什么的&#xff1f; a) 控制元素位置 b)…...

c 语言 中 是否有 unsigned 安;这种写法?

你提到的结构体定义使用了unsigned这种没有完全限定类型的写法&#xff0c;在C语言中&#xff0c;这种语法通常会被解释为unsigned int。这是因为在C语言中&#xff0c;unsigned是unsigned int的缩写形式。 下面是你的结构体定义以及解释&#xff1a; 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、函数模版&#xff08;1&#xff09;概念&#xff08;2&#xff09;函数模版格式&#xff08;3&#xff09;函数模版的原理&#xff08;4&#xff09;函数模版的实例化①显式实例化②隐式实例化 &#xff08;5&#xff09;模版参…...

51单片机学习(4)

一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程&#xff0c;模块化编程之后要对其进行注释&#xff0c;以便之后使用模块化函数&#xff0c;对模块化.c文件中的每一个函数进行注释。 注意&#xff1a;一个函数不能既在主函数又在中断函数中 模式1最常用&#xf…...

3D问界—MAYA制作铁丝栅栏(透明贴图法)

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

编译器对C++23的支持程度

详见这里...

k8s核心操作_存储抽象_K8S中使用Secret功能来存储密码_使用免密拉取镜像_k8s核心实战总结---分布式云原生部署架构搭建033

注意在看的时候一定要把 dxxxx中的xxxx换成--o----c----k----e----r 然后我们再来看一个k8s中的secret的功能,这个功能 用来存储密码的,configMap是用来存配置的 比如我们有个pod,他的镜像,如果是需要密码的,那么 我们现在是从公共仓库拉取的,如果我们从私有仓库拉取,有密码…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...