Spring Boot实现接口限流

API限流是一种重要的策略,用于控制对API的访问速率,以保护后端服务免受过载和滥用。以下是API限流的必要性:

  1. 防止服务过载

    当API的请求量突然激增时,如果没有限流措施,可能会导致服务器资源耗尽,从而影响服务的稳定性和可用性。
  2. 提高系统稳定性

    通过限制每个用户的请求频率,可以确保系统在高负载下仍能正常运行,避免因单个用户或服务的过度请求而导致的系统崩溃。
  3. 防止恶意攻击

    限流可以作为一种安全措施,防止恶意用户通过发起大量请求来攻击系统,如DDoS攻击或暴力破解尝试。

在 Spring Boot 中,可以通过多种方式实现接口限流。

以下是几种常用的实现方法:

1. 使用 Bucket4j

Bucket4j 是一个 Java 的限流库,可以很容易地集成到 Spring Boot 项目中。

步骤:

  1. 添加 Maven 依赖:

    <!-- https://mvnrepository.com/artifact/com.bucket4j/bucket4j-core -->
    <dependency><groupId>com.bucket4j</groupId><artifactId>bucket4j-core</artifactId><version>8.10.1</version>
    </dependency>
    
  2. 创建限流配置:

    import net.jodah.bucket4j.Bucket;
    import net.jodah.bucket4j.BucketBuilder;
    import java.time.Duration;@Service
    public class RateLimiterService {private final Bucket bucket;public RateLimiterService() {this.bucket = Bucket.builder().addLimit(BucketLimit.of(10, Duration.ofMinutes(1))).build();}public boolean tryConsume() {return bucket.tryConsume(1);}
    }
    
  3. 在控制器中使用限流:

    @RestController
    public class MyController {private final RateLimiterService rateLimiterService;@Autowiredpublic MyController(RateLimiterService rateLimiterService) {this.rateLimiterService = rateLimiterService;}@GetMapping("/api")public ResponseEntity<String> api() {if (!rateLimiterService.tryConsume()) {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过于频繁,请稍后再试。");}return ResponseEntity.ok("请求成功!");}
    }
    

2. 使用 Spring Cloud Gateway

如果你使用 Spring Cloud Gateway,可以在配置文件中设置限流规则。

示例配置:

spring:cloud:gateway:routes:- id: my_routeuri: lb://my-servicepredicates:- Path=/api/**filters:- requestRateLimiter:rateLimiter:refillPolicy:tokens: 10duration: 1sburstCapacity: 20

3. 使用 AOP 方式

通过 AOP(面向切面编程)也可以实现限流。

步骤:

  1. 创建注解:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface RateLimit {int limit() default 10; // 限制次数int timeout() default 60; // 超时时间
    }
    
  2. 使用 AOP 切面:

    @Aspect
    @Component
    public class RateLimitAspect {// 实现限流逻辑@Around("@annotation(rateLimit)")public Object limit(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {// 限流逻辑return joinPoint.proceed();}
    }
    
  3. 在需要限流的控制器方法上使用:

    @RestController
    public class MyController {@RateLimit(limit = 10, timeout = 60)@GetMapping("/api")public ResponseEntity<String> api() {return ResponseEntity.ok("请求成功!");}
    }
    

4. 集成第三方库Resilience4j

  • Resilience4j是一个轻量级的容错库,它提供了多种限流器实现,如SemaphoreBasedRateLimiter
  • 添加Resilience4j依赖后,可以配置限流器,并在控制器中使用注解@RateLimiter进行限流。

5.使用分布式锁实现限流

  • 在某些情况下,可以使用分布式锁(如Redisson)来实现限流,尤其是在需要防止用户重复操作的场景中。

结论

以上是常用的几种限流实现方式,可以根据项目需求选择适合的方法。

选择哪种限流方案取决于具体的业务需求和系统架构。对于分布式系统,通常推荐使用Redis或第三方库如Resilience4j来实现限流,以保证限流的准确性和一致性。而对于单机应用,Guava RateLimiter或Spring Boot Actuator的@RateLimiter注解可能是更简单的选择。

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

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

相关文章

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署&#xff0c;文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署&#xff0c;只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

2.Node.js 缓冲器(Buffer)

二、常用模块 2.1Buffer(缓冲器) 2.1.1概念 Buffer是一个类似于数组的对象&#xff0c;用于表示固定长度的字节序列 Buffer本质是一段内存空间&#xff0c;专门用来处理二进制数据 2.2.2特点 Buffer大小固定无法调整&#xff1b; Buffer性能较好&#xff0c;可以直接操…

科技云报到:大模型时代下,向量数据库的野望

科技云报到原创。 自ChatGPT爆火&#xff0c;国内头部平台型公司一拥而上&#xff0c;先后发布AGI或垂类LLM&#xff0c;但鲜有大模型基础设施在数据层面的进化&#xff0c;比如向量数据库。 在此之前&#xff0c;向量数据库经历了几年的沉寂期&#xff0c;现在似乎终于乘着Ch…

Linux驱动开发——设备树

文章目录 1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS语法3.1 dtsi头文件3.2 设备节点3.3 标准属性3.4 根节点compatible属性3.5 向节点追加或修改内容 4 创建小型模板设备树5 设备树在系统中的体现6 绑定信息文档7 设备树常用OF操作函数7.1 查找节点的OF函数7.2 查找父/子…

Unity Meta Quest 开发调试工具 Immersive Debugger

XR 开发者社区链接&#xff1a; 赠送原版GPT、完整课程、项目下载、项目孵化宣发、答疑、投融资&#xff08;YY&#xff09; 此工具可以在头显当中对 Unity 脚本的参数进行调整&#xff08;相当于在编辑器 Inspector 里调整脚本参数&#xff09;&#xff0c;并且还可以查看 Un…

免费送源码:Java+B/S+MySQL springboot电影推荐系统 计算机毕业设计原创定制

摘 要 随着互联网与移动互联网迅速普及&#xff0c;网络上的电影娱乐信息数量相当庞大&#xff0c;人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的电影推荐系统成为一个热门。然而电影信息的表示相当复杂&#xff0c;己有的相似度计算方法与推荐算法都各有优势&#…

赋能特大城市水务数据安全高速运算,深圳计算科学研究院YashanDB数据库系统斩获“鼎新杯”二等奖

第三届“鼎新杯”数字化转型应用优秀案例评选结果日前正式公布&#xff0c;深圳计算科学研究院联合深圳市环境水务集团有限公司申报的《深圳环境水务国产数据库YashanDB&#xff0c;赋能特大城市水务数据安全高速运转》案例&#xff0c;经过5个多月的评审&#xff0c;从4000申报…

Docker搭建Cisco AnyConnect 教程

本章教程搭建一个Cisco AnyConnect 连接教程。 一、下载文件 因为是基于Docker方式进行搭建的,所以需要提前安装好Docker,本章不介绍如何安装Docker,可以自行百度解决。 通过网盘分享的文件:ocserv-docker 链接: https://pan.baidu.com/s/14-2p9jenqE0KWzMilVzV-A?pwd=4yd…

穷举vs暴搜vs深搜vs回溯vs剪枝(一)

文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目&#xff1a;全排列 思路 通过深度优先搜索的方式&#xff0c;不断枚举每个数在当前位置的可能性&#xff0c;然后回溯到上一个状态&#xff0c;直到枚举完所有可能性得到正确的结果 r…

幂律分布笔记

一、幂律分布的数据拟合 数据分箱&#xff1a; 所谓分箱就是对原始数据进行分组&#xff0c;然后对每一组内的数据进行平滑处理。常见的分箱方式主要有等深分箱、等宽分箱、用户自定义等 对数分箱&#xff1a; 对原数据进行分箱&#xff0c;第i个箱的宽度为bi&#xff0c;b…

客户案例 | Ansys与台积电和微软合作加速光子仿真

Ansys与台积电和微软展开合作&#xff0c;将硅光子器件的仿真和分析速度提高10倍以上 主要亮点 借助使用NVIDIA图形处理单元&#xff08;GPU&#xff09;的Microsoft Azure虚拟机&#xff0c;Ansys Lumerical™ FDTD 3D电磁仿真的光子器件仿真速度实现了10倍提升 凭借Azure云…

CRMEB标准版Mysql修改sql_mode

数据库配置 1.宝塔控制面板-软件商店-MySql-设置 2.点击配置修改&#xff0c;查找sql-mode或sql_mode &#xff08;可使用CtrlF快捷查找&#xff09; 3.复制 NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 然后替换粘贴&#xff0c;保存 注&#xff1a;MySQL8.0版本的 第三步用…

Vulkan 开发(三):Vulkan 物理设备

Vulkan 物理设备 图片来自《 Vulkan 应用开发指南》 上一节了解了 Vulkan 实例&#xff0c;一旦有了实例&#xff0c;就可以查找系统里安装的与 Vulkan 兼容的物理设备。 Vulkan 物理设备&#xff08;PhysicalDevice&#xff09;一般是指支持 Vulkan 的物理硬件&#xff0c;通…

基于模型设计的智能平衡移动机器人-基础实验eCAP

目录 eCAP基本介绍 捕捉模式或者是APWM模式 捕获模块功能 CCS中打开模型 eCAP基本介绍 TMS320F28069的捕获单元模块能够捕获外部输入引脚的逻辑状态&#xff08;电平的高或低、电平翻转时的上升沿或下降沿&#xff09;&#xff0c;并利用内部定时器对外部事件或者引脚状态变…

关于网络接口监测工具ifstat命令的功能详解以及Linux下lsof命令的使用详解

一、关于网络接口监测工具ifstat命令的应用 ifstat工具是个网络接口监测工具,比较简单看网络流量&#xff0c;像VMSTAT那样一行行显示着浏览信息&#xff0c;可以设置显示某个或所有网卡流量数据。ifstat默认不监控回环接口&#xff0c;显示的流量单位是KB。系统默认未安装&…

【目标检测---旋转框标注】roLabelImg安装与使用

在目标检测领域&#xff0c;数据标注是至关重要的一环。为了提升模型的准确率和泛化能力&#xff0c;高质量的标注数据集是必不可少的。而roLabelImg作为一款专门用于标注旋转框的工具&#xff0c;为处理复杂场景下的目标检测提供了极大的便利。本文将详细介绍roLabelImg的安装…

电力变压器故障诊断数据集(猫脸码客 第219期)

电力变压器故障诊断数据集 电力变压器作为电力系统中不可或缺的重要设备&#xff0c;其稳定性和可靠性直接关系到整个电网的安全运行。然而&#xff0c;由于运行环境复杂、负载多变以及设备老化等因素&#xff0c;变压器在运行过程中难免会出现各种故障。这些故障若不能及时发…

【解决Docker无剩余存储磁盘空间问题】

【解决Docker无剩余存储磁盘空间问题】 目录 【解决Docker无剩余存储磁盘空间问题】一、问题概述二、问题原因三、解决方案1、方案一&#xff1a;清除Docker磁盘空间2、方案二&#xff1a;更换Docker磁盘存储目录 一、问题概述 执行Docker build -t [镜像名] [源目录] 命令报错…

基于Neo4j的推理知识图谱展示:智能系统与图谱可视化

还在找毕业设计项目吗&#xff1f;试试我们基于Neo4j打造的推理知识图谱展示系统&#xff01;这是一个兼具前沿技术与实战经验积累的项目&#xff0c;完美适合作为你的毕业设计。 &#x1f449; 什么是知识图谱&#xff1f; 简单来说&#xff0c;它是通过连接的节点&#xff0…

线性代数基础02

目录 1.向量 1.1向量的定义 1.2向量的运算 1.2.1向量加法 1.2.2向量数乘 1.2.3向量点积 1.3矩阵的特征值和特征向量 1.4向量的模 1.4.1向量的模的定义 1.4.2向量的模的几何解释 1.4.3向量的模的性质 1.5向量的内积 1.5.1向量的内积的定义 1.5.2向量的内积的几何解…