【接口负载】✈️整合 Resilience4j 指定接口负载,避免过载

目录

👋前言

🍸一、应用场景

🍻二、 代码实现

🍹三、扩展

🍸四、章末


👋前言

        小伙伴们大家好,上次本地实操了下针对百万级数据量如何快速排序、指定条件获取等,文章内容包括:SpringBoot 中如何集成 redis、多线程批量创建测试数据、缓存预热等可以参考下,文章链接如下:

【SpringBoot】⭐️整合 Redis 实现百万级数据实时排序_springboot redis 排序-CSDN博客

 

        这篇文章将本地实现如何控制接口的负载,也就是如何指定一段时间内接口可以接收的请求上限

🍸一、应用场景

        什么场景下需要考虑接口的负载,简单讲就是那些访问量过大的接口如果会影响系统的运行则需要提前准备负载规则,避免过载

        单体应用:

                单体项目中,某些关键接口可以使用限流,避免系统崩溃(比如,处理大量数据的接口,如果业务操作中会将大量数据加载到内存,那么该接口就需要限流,避免高并发情况下,导致内存溢出)

        第三方API:

                如果对接的部分 api 本身有限流策略限制,那么在自己应用中限流,可以更好的管理调用频率,避免触发对方的限流机制

        API网关:

                微服务架构中,可以在整个系统的入口处进行限流,控制进入系统的请求频率,放置后端服务过载

        ...

        针对以上场景,可以提前准备限流规则,具体的工具有很多,比如阿里的 sentinel 限流工具,支持各种策略,可以参考之前的文章:

 【Sentinel的限流使用】⭐️SpringCloud整合Sentinel实现Api的限流_sentinel api管理-CSDN博客

        但是使用 Sentinel 实现更偏向于 SpringCloud 整合,因为是一个单独的服务,本地使用的话需要先启动 sentinel 服务,然后在自己项目中才可以正常使用;这里也可以使用另一个工具,就是标题中的 Resilience4j ,是一个轻量级的容错库,用于在 Java 应用中实现各种常见的失败模式,比如超时、请求限制、重试等。

🍻二、 代码实现

        2.1 添加依赖

        <!-- Resilience4j Spring Boot2 --><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>1.7.0</version></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-retry</artifactId><version>1.7.0</version></dependency>

        2.2 配置限流规则

        如下,这里的 exampleRateLimiter 是自定义的限制器(10秒内最大请求为3)

resilience4j.ratelimiter:instances:exampleRateLimiter:limitForPeriod: 3limitRefreshPeriod: 10000mstimeoutDuration: 500ms

        2.3 限流注解使用

        创建一个请求控制器类,测试下自定义的限制器是否正常

        这里指定了重定向方法,也就是被限流的请求会被重定向到指定的方法,返回对应的信息

@RestController
@RequestMapping("/testRate")
@Slf4j
public class RateLimitController {@GetMapping("/testLimit")@RateLimiter(name = "exampleRateLimiter",fallbackMethod = "handleFallBack")public String testLimit(){log.info("allow operating");return "success";}public String handleFallBack( Throwable throwable){log.error(" callBack method called due to rateLimiting ",throwable);return "request limited, please try later";}}

        2.4 测试

         如图,目前的规则是10秒内允许进入三次请求,剩下的执行拒绝方法;postman 模拟下请求即可,快速点击几次,看下控台日志,进入了三个请求,剩余请求都被拒绝,并且执行了重定向的方法,说明自定义的限流工具生效

🍹三、扩展

        到这里基于 Resilience4j 的限流方式已经实现了, 这个工具还可以支持自动重试,可以指定重试的类型(遇到指定的类型错误后,可以自动重试),来试下

        3.1 自定义重试机制

        跟自定义限制器一样,也是在配置文件中添加对应配置,这里是自定义了一个遇到 RuntimeException 异常的重试机制,会进行三次重试,每次重试间隔1秒,三次仍然出错,则直接返回

resilience4j.retry:instances:testRetry:maxAttempts: 3  # 最大重试次数waitDuration: 1000ms  # 每次重试的间隔retryExceptions:- java.lang.RuntimeException  # 针对 RuntimeException 进行重试

        3.2 重试注解使用

        这里指定了重试机制的名称,并且指定了重定向方法

        方法体较简单,每次请求会随机生成一个随机数,大于 0.5 则抛出 RuntimeException 异常,小于的话则正常返回提示

    @GetMapping("/testRetry")@Retry(name = "testRetry", fallbackMethod = "handleFallBack")public String testRetry() {return externalServiceCall();}public String externalServiceCall() {// 模拟外部服务调用失败double random = Math.random();if (random > 0.5) {log.error("currentNum {} ,service call failed, retrying...",random);throw new RuntimeException("service failure");}log.info("currentNum {},service call succeeded");return "success : " + random;}

        3.3 测试

        模拟一个请求,测试结果如下:

        重试了三次,每次间隔一秒,还是没有通过,然后进行了方法重定向

🍸四、章末

        以上是基于  Resilience4j 依赖引入的方式实现,相比于 sentinel 工具实现简单,但是使用可能不如其方便,因为 sentinel 可以随时调整配置,并且对代码的侵入性不是很强;

        另外就是这种也可以自己实现,比如使用 redis 统计对应接口的指定时间内访问次数,超过了指定次数就拦截,这里就不重复造轮子了

        文章到这里就结束了~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS—网格布局Grid

网格布局grid 提供了带有行和列的基于网格的布局系统&#xff0c;无需使用浮动和定位。 当 HTML 元素的 display 属性设置为 grid 或 inline-grid 时&#xff0c;它就会成为网格容器。 更多布局模式可以参考之前的博客&#xff1a; ​​​​​​CSS—flex布局、过渡transit…

表格columns拼接两个后端返回的字段(以umi框架为例)

在用组件对前端项目进行开发时&#xff0c;我们会遇到以下情况&#xff1a;项目原型中有取值范围这个表字段&#xff0c;需要存放最小取值到最大取值。 而后端返回给我们的数据是返回了一个最小值和一个最大值&#xff0c; 在columns中我们需要对这两个字段进行拼接&#xff0…

Git系列之git tag和ReleaseMilestone

以下是关于 Git Tag、Release 和 Milestone 的深度融合内容&#xff0c;并补充了关于 Git Tag 的所有命令、详细解释和指令实例&#xff0c;条理清晰&#xff0c;结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交&#xff08;commit&#xf…

SQLiteStudio:一款免费跨平台的SQLite管理工具

SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面&#xff0c;简化了数据库的创建、编辑、查询和维护&#xff0c;适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括&#xff1a; 免费开源&#xff0c;可…

VMware workstation 17安装过程详细指南

VMware 17安装过程详细指南 一、准备工作 在开始安装 VMware 之前&#xff0c;你需要确保你的计算机满足以下条件&#xff1a; 操作系统&#xff1a;VMware Workstation 支持多种 Windows 和 Linux 操作系统。确保你的操作系统版本在 VMware 支持的范围内。 硬件要求&#…

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理

【从零开始学习计算机科学】计算机组成原理&#xff08;六&#xff09;异常事件处理 异常事件处理异常处理的数据通路异常事件入口地址 异常事件处理 异常和中断事件改变处理机正常指令的执行顺序。异常指令执行过程中&#xff0c;由于操作非法和指令非法引起的事件。陷阱指陷…

基于DeepSeek的智慧医药系统(源码+部署教程)

运行环境 智慧医药系统运行环境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技术栈&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…

WinUI 3 支持的三种窗口 及 受限的窗口透明

我的目标 希望能够熟悉 WinUI 3 窗口的基本使用方式&#xff0c;了解可能出现的问题 。 WinUI 3 支持三种窗口模式&#xff0c;分别为&#xff1a;常规窗口模式、画中画模式、全屏模式。 窗口模式&#xff1a;常规 即我们最常见的普通窗口。 支持&#xff1a;显示最大化按钮…

《云原生监控体系构建实录:从Prometheus到Grafana的观测革命》

PrometheusGrafana部署配置 Prometheus安装 下载Prometheus服务端 Download | PrometheusAn open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.https://prometheus.io/…

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案1

目的&#xff0c;判断是否主键重复&#xff0c;不重复则登录新数据&#xff0c;重复则不登录。 定义类型&#xff1a; DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下&#xff1a; 模拟数据库的登录过程。假设…

MySql的in和join对比谁更高效

公司有个SQl根据时间判断是否变化进而更新到主表通知下游服务告知变化 首先看下优化前和优化后的sql&#xff1a; 优化前&#xff1a;执行很慢 UPDATE vrs_video SET updated_at now() WHEREvrs_video.id IN (SELECT DISTINCTvideo_id FROMvrs_play_source WHEREvrs_play_…

用BGE Large ZH 1.5获取向量以及重排序构建生产环境可用restful API的Python代码讲解

开篇 嘿&#xff0c;各位小伙伴&#xff01;今天我们来聊一个超级有趣的话题&#xff1a;embedding向量化数据。听起来很高大上对不对&#xff1f;别担心&#xff0c;让我用最简单的方式告诉你这是啥。 想象一下&#xff0c;你有一大堆文字、图片或者其他数据&#xff0c;想要…

【OneAPI】网页截图API-V2

API简介 生成指定URL的网页截图或缩略图。 旧版本请参考&#xff1a;网页截图 V2版本新增全屏截图、带壳截图等功能&#xff0c;并修复了一些已知问题。 全屏截图&#xff1a; 支持全屏截图&#xff0c;通过设置fullscreentrue来支持全屏截图。全屏模式下&#xff0c;系统…

1个基于 Three.js 的 Vue3 组件库

大家好&#xff0c;我是大澈&#xff01;一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;关注我&#xff0c;科技未来或许我能帮到你&#xff01; Tres.js 是一个基于 Three.js 的 Vue 3 组件库&#xff0c;旨在简…

QT | 信号与槽(超详解)

前言 对qt信号和槽的详细解释 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&am…

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…

Qwen2.5-7B-Instruct进行自我认知微调

使用镜像&#xff1a; modelscope/ms-swift/swift_lora_qwen2:v1 数据集和模型下载&#xff1a; 数据集内容&#xff1a; 启动命令&#xff1a; CUDA_VISIBLE_DEVICES0 \ swift sft \ --model Qwen/Qwen2.5-7B-Instruct \ --train_type lora \ --dataset AI-Mod…

百问网提供的烧写工具将各镜像文件烧写到eMMC存储器的各脚本的解析

重要说明:本文的烧写目标存储器是eMMC存储器 百问网提供的烧写工具不仅可以把各镜像文件烧写到eMMC存储器&#xff0c;还可以烧写到NADN&#xff0c;SD卡等存储设备&#xff0c;如下图所示&#xff1a; 但是本文的烧写目标存储器是eMMC存储器&#xff0c;这点是前提&#xff…

android studio开发文档

android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…

Unity Dots

文章目录 什么是DotsDOTS的优势ECS&#xff08;实体组件系统&#xff09;Job System作业系统Burst编译器最后 什么是Dots DOTS&#xff08;Data-Oriented Technology Stack&#xff09;是Unity推出的一种用于开发高性能游戏和应用的数据导向技术栈&#xff0c;包含三大核心组件…