Spring Boot 中使用 Resilience4j 实现弹性微服务的简单了解

news2024/9/22 15:25:45

1. 引言

在微服务架构中,服务的弹性是非常重要的。Resilience4j 是一个轻量级的容错库,专为函数式编程设计,提供了断路器、重试、舱壁、限流器和限时器等功能。

这里不做过多演示,只是查看一下官方案例并换成maven构建相关展示;

2.配置

spring:
  application.name: resilience4j-demo
  jackson.serialization.indent_output: true # 格式化输出json

server:
  port: 9080

management.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 demo
  environment: ${spring.profiles.active}
  version: 0.0.1

management.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 # 是否取消正在运行的Future
      timeoutDuration: 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://www.coloradmin.cn/o/1932843.html

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

相关文章

hexo搭建博客(github node git )(失败版本)

HexoGitHub搭建个人博客教程&#xff08;2023最新版&#xff09; 搭建失败了 是因为git命令一直报错 打算明天把git和node版本全部重新安装后再弄 同时回顾一下github git 和 node的基础知识 Github新手之路&#xff08;全过程&#xff09;&#xff08;站在前辈的肩膀上的总…

使用 ABBYY FineReader PDF 15 在创建或转换 PDF 时自动生成书签

使用 ABBYY 为 PDF 文件添加书签&#xff0c;可以帮助快速定位文档中的主要内容&#xff0c;也能更方便的梳理出一份文档大纲。 有很多 PDF 文件在创建时并没有编辑书签&#xff0c;这里介绍使用 ABBYY FineReader PDF 15&#xff08;Win 系统&#xff09;在 PDF 中自动添加书…

两大国产多模态大模型推荐

GLM-4V 智谱AI 开放平台提供一系列具有不同功能和定价的大模型&#xff0c;包括通用大模型、超拟人大模型、图像大模型、向量大模型等&#xff0c;并且支持使用您的私有数据对模型进行微调。GLM-4V 就是在不牺牲任何NLP任务性能的情况下&#xff0c;实现了视觉语言特征的深度融…

网络编程-TCP/IP

网络概述 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机组合在一起。 每层实现不同的功能&#xff0c;其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务&#xff0c;同时使用下层提供的服务 网络体系结构…

【LeetCode】删除排序链表中的重复元素 II

目录 一、题目二、解法完整代码 一、题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5] 示例 …

WEB前端06-DOM对象

BOM浏览器对象模型 浏览器对象模型&#xff1a;将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型&#xff0c;提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window&#xff1a;浏览器窗口对象 Navigator&…

win11局域网共享打印机或者文件提示:\\计算机名 无法访问。你可没有权限使用网络资源。请与这台服务器的管理员联系以查明你是香有访问权限。网络不存在或尚未启动。解决方法

win11局域网共享打印机或者文件提示&#xff1a;\\计算机名 无法访问。你可没有权限使用网络资源。请与这台服务器的管理员联系以查明你是香有访问权限。网络不存在或尚未启动。 是因为win11更新会默认关闭不安全的SMB1协议&#xff0c;导致局域网共享不可用。既然这样&#xf…

Web开发:四角线框效果(HTML、CSS、JavaScript)

目录 一、实现效果 二、完整代码 三、页面准备 1、页面结构 2、初始样式 3、现有效果 三、线框实现 1、需求分析 2、线框结构 3、线框大小 4、线框位置 5、线框样式 6、移动线框 7、添加过渡效果 8、使用CSS变量 一、实现效果 如下图所示&#xff0c;当鼠标移动…

项目管理进阶之RACI矩阵

前言 项目管理进阶系列续新篇。 RACI&#xff1f;这个是什么矩阵&#xff0c;有什么用途&#xff1f; 在项目管理过程中&#xff0c;如Team规模超5以上时&#xff0c;则有必要采用科学的管理方式&#xff0c;满足工作需要。否则可能事倍功半。 Q&#xff1a;什么是RACI矩阵 …

SQL面试题练习 —— 查询每个用户最大连续登录天数

目录 1 题目2 建表语句3 题解 1 题目 查询每个用户最大连续登录天数 样例数据如下 login_log&#xff1a; 2 建表语句 --建表语句 create table if not exists login_log (user_id int comment 用户id,login_time date comment 登录时间 ); --数据插入 INSERT overwrit…

N Puzzle (数字推盘游戏)

N Puzzle [数字推盘游戏] 1. 15 Puzzle2. N PuzzleReferences puzzle /ˈpʌzl/&#xff1a;n. 谜&#xff0c;智力游戏&#xff0c;疑问&#xff0c;不解之谜&#xff0c;令人费解的事 vt. 迷惑&#xff0c;使困惑1. 15 Puzzle https://en.wikipedia.org/wiki/15_puzzle The…

Python 在Word表格中插入、删除行或列

Word文档中的表格可以用于组织和展示数据。在实际应用过程中&#xff0c;有时为了调整表格的结构或适应不同的数据展示需求&#xff0c;我们可能会需要插入、删除行或列。以下提供了几种使用Python在Word表格中插入或删除行、列的方法供参考&#xff1a; 文章目录 Python 在Wo…

Qt QProcess 进程间通信读写数据通信

本文介绍了如何使用Qt的QProcess 进行程序开发&#xff0c;包括启动进程间通信、设置环境变量、通用方法&#xff1b;方便在日常开发中使用&#xff1b; 1.使用Qt进行程序开发&#xff0c;可以通过QProcess类用于启动外部程序并与其进行通信.&#xff1b; 进程A&#xff08;…

【时时三省】tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

Hadoop3:MR程序的数据倾斜问题处理

一、数据倾斜 什么是数据倾斜&#xff1f; 学过Redis集群的都知道数据倾斜这个问题。 就是大量数据&#xff0c;分配不均匀的现象。 二、MR数据倾斜 1、怎么判断出现数据倾斜&#xff1f; 数据频率倾斜——某一个区域的数据量要远远大于其他区域。 数据大小倾斜——部分记…

【STM32】RTT-Studio中HAL库开发教程四:DAC+DMA输出波形

文章目录 一、DAC介绍二、HAL库配置初始化三、RTT中初始化四、测试验证 一、DAC介绍 1.DAC作用 DAC&#xff08;Digital-to-Analog Converter&#xff09;&#xff0c;即为数字/模拟转换模块&#xff0c;又称D/A转换器&#xff1b;作用就是把输入的数字编码&#xff0c;转换成…

昇思25天学习打卡营第16天 | Vision Transformer图像分类

昇思25天学习打卡营第16天 | Vision Transformer图像分类 文章目录 昇思25天学习打卡营第16天 | Vision Transformer图像分类Vision Transform&#xff08;ViT&#xff09;模型TransformerAttention模块Encoder模块 ViT模型输入 模型构建Multi-Head Attention模块Encoder模块Pa…

Java对象转换为JSON字符串

0 写在前面 业务中有很多场景需要 把一个带有数据的 Java对象/Java集合转换为JSON 存入数据库中。 在需要的时候还需要吧和这个JSON字符串拿出来再次转换成Java对象/集合 1 Java对象与JSON字符串互转 引入依赖: <dependency><groupId>com.alibaba</groupId&…

解决VMware虚拟机在桥接模式下无法上网的问题

解决VMware虚拟机在桥接模式下无法上网的问题 windows11系统自动启动了热点功能&#xff0c;开启热点可能会干扰虚拟机的桥接设置。 方法一&#xff1a;windows11可以提供网络热点服务 方法二&#xff1a;手动指定桥接的物理网卡 方法一&#xff1a;关闭热点功能 优点&#xff…

【Java项目笔记】01项目介绍

一、技术框架 1.后端服务 Spring Boot为主体框架 Spring MVC为Web框架 MyBatis、MyBatis Plus为持久层框架&#xff0c;负责数据库的读写 阿里云短信服务 2.存储服务 MySql redis缓存数据 MinIO为对象存储&#xff0c;存储非结构化数据&#xff08;图片、视频、音频&a…