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;可以直接操…

Kafka、Zookeeper、Redis、MySQL和Elasticsearch(ES)鉴权配置

在容器化环境中部署Kafka、Zookeeper、Redis、MySQL和Elasticsearch&#xff08;ES&#xff09;时&#xff0c;确保这些服务的安全性是非常重要的。以下是如何检查和配置这些服务的鉴权&#xff08;认证和授权&#xff09;机制&#xff0c;以及相关配置文件的路径和配置方法。 …

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

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

电子电气架构---汽车OEM敏捷式集成方案简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

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…

Flink 窗口触发器Triggers

Triggers ❝ 定义&#xff1a;触发器决定了窗口何时被触发。在Flink中&#xff0c;窗口的触发是通过设置定时器来实现的。 作用&#xff1a;控制窗口数据的聚合时机&#xff0c;确保数据在适当的时间点被处理和输出。 Trigger关键方法 onElement: 当元素被添加到窗口时调用&a…

幂律分布笔记

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

Frp 在云服与内网服务器间实现端口映射

回顾&#xff1a;ssh -L 与 autossh Frp 使用 toml 语言配置多端口映射 内网服务器 SSH 22 端口暴露到云服指定端口 内网服务器 SSL 443 端口暴露到云服指定端口 临时禁用内网服务器 443 端口映射&#xff0c;SSH 远程维护也将不可用 开发机调测与内网服务器布署需要经常切换使…

本地部署 mini-omni

本地部署 mini-omni 1. 创建虚拟环境2. 克隆代码3. 安装依赖模块4. 启动 server5. 运行 streamlit demo6. 运行 gradio demo 1. 创建虚拟环境 conda create -n omni python3.10 conda activate omni2. 克隆代码 git clone https://github.com/gpt-omni/mini-omni.git cd mini…

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

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

LeetCode 第420场周赛个人题解

目录 Q1. 出现在屏幕上的字符串序列 原题链接 思路分析 AC代码 Q2. 字符至少出现 K 次的子字符串 I 原题链接 思路分析 AC代码 Q3. 使数组非递减的最少除法操作次数 原题链接 思路分析 AC代码 Q4. 判断 DFS 字符串是否是回文串 原题链接 思路分析 AC代码 Q1. 出…

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;并利用内部定时器对外部事件或者引脚状态变…