Spring Boot 3自定义注解+拦截器+Redis实现高并发接口限流

在当今互联网应用开发中,高并发访问是一个常见的挑战。为了保障系统的稳定性和可靠性,我们需要对接口进行限流,防止因过多的请求导致系统崩溃。

本文将介绍如何利用Spring Boot 3中的自定义注解、拦截器和Redis实现高并发接口限流,帮助程序员解决这一挑战。

1. 自定义注解

首先,我们需要定义一个自定义注解,用来标识需要进行限流的接口。在Spring Boot中,可以通过自定义注解来实现对接口的标记和控制。下面是一个简单的自定义注解的示例:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {int value() default 100; // 默认限流阈值为100int seconds() default 60; // 默认时间窗口为60秒
}

2. 拦截器

接下来,我们需要编写一个拦截器,用来拦截被@AccessLimit注解标记的接口,并进行限流处理。拦截器可以在请求到达Controller之前进行预处理,从而实现对接口的限流控制。

下面是一个简单的拦截器的示例:

@Component
public class AccessLimitInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);if (accessLimit != null) {int limit = accessLimit.value();int seconds = accessLimit.seconds();String key = request.getRequestURI();String count = redisTemplate.opsForValue().get(key);if (count == null) {redisTemplate.opsForValue().set(key, "1", seconds, TimeUnit.SECONDS);} else {int accessCount = Integer.parseInt(count);if (accessCount < limit) {redisTemplate.opsForValue().increment(key);} else {response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());return false;}}}}return true;}
}

3. 注册拦截器

接下来,我们需要将拦截器注册到Spring Boot应用程序中,以便拦截器能够生效。在Spring Boot中,可以通过WebMvcConfigurer来注册拦截器。

下面是一个简单的拦截器注册的示例:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate AccessLimitInterceptor accessLimitInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(accessLimitInterceptor);}
}

4. Redis实现限流

最后,我们需要利用Redis来实现接口的限流功能。Redis是一个高性能的内存数据库,非常适合用来存储限流的计数器。我们可以利用Redis的原子操作来实现对接口访问次数的统计和控制。

下面是一个简单的利用Redis实现限流的示例:

@Component
public class AccessLimitInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);if (accessLimit != null) {int limit = accessLimit.value();int seconds = accessLimit.seconds();String key = request.getRequestURI();String count = redisTemplate.opsForValue().get(key);if (count == null) {redisTemplate.opsForValue().set(key, "1", seconds, TimeUnit.SECONDS);} else {int accessCount = Integer.parseInt(count);if (accessCount < limit) {redisTemplate.opsForValue().increment(key);} else {response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());return false;}}}}return true;}
}

总结

通过以上步骤,我们成功地利用Spring Boot 3中的自定义注解、拦截器和Redis实现了高并发接口限流。

这种方式能够有效地保护系统免受高并发请求的影响,保障系统的稳定性和可靠性。

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

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

相关文章

牛客社区帖子分页显示实现

下图是前端分页的组件&#xff1a; 下面是对应的静态html页面&#xff0c;每一个方块&#xff0c;都是一个a标签&#xff0c;可以点击&#xff0c;执行的链接是/community/index&#xff0c;GET请求&#xff0c;拼接的参数是current&#xff0c;也就是pageNum&#xff0c;只需…

使用Python实现语音识别与处理模型

语音识别与处理是一项重要的人工智能技术&#xff0c;它可以将人类语音转换成文本形式&#xff0c;从而实现语音命令识别、语音转写等功能。在本文中&#xff0c;我们将介绍语音识别与处理的基本原理和常见的实现方法&#xff0c;并使用Python来实现这些模型。 什么是语音识别…

力扣HOT100 208. 实现Trie(前缀树)

解题思路&#xff1a; class Trie {private Trie[] children; // 存储子节点的数组private boolean isEnd; // 记录是否为单词结尾public Trie() {children new Trie[26]; // 数组大小为26&#xff0c;代表26个小写字母isEnd false;}public void insert(String word) {Trie …

智能小程序 Ray 开发实践——基础内容组件 Text 和 Icon 介绍

Text 文本内容。 导入 import { Text } from ray-js/ray; Props 属性类型默认值说明支持平台classNamestring样式名涂鸦、微信selectablebooleanfalse文本是否可选涂鸦、微信onClick(e: { type: click }) > voidfalse点击事件涂鸦、微信 示例代码 基本使用 import Re…

【yolov8算法道路-墙面裂缝检测-汽车车身凹陷-抓痕-损伤检测】

yolo算法道路-墙面裂缝检测-汽车车身凹陷-抓痕-损伤检测 1. yolo算法裂缝检测-汽车车身凹陷-抓痕检测-汽车车身损伤检测2. yolo房屋墙面路面裂缝-发霉-油漆脱落-渗水-墙皮脱落检测3. 水泥墙面裂缝检测 YOLOv8算法是一种先进的目标检测技术&#xff0c;它基于YOLO系列算法的改进…

探索矿业数字化平台:实现智能化采矿与管理

随着信息技术的迅猛发展&#xff0c;矿业领域也在逐步实现数字化转型。数字化平台的出现为矿业企业带来了更高效、更智能的采矿与管理方式。本文将探讨矿业数字化平台的意义、特点以及未来发展方向。 ### 1. 数字化平台的意义 传统的矿业生产和管理方式存在诸多问题&#xff…

关于Kotlin

Kotlin是一种由JetBrains公司开发的静态类型编程语言&#xff0c;它专为现代多平台应用设计。Kotlin的语法简洁&#xff0c;安全且实用&#xff0c;并且专注于与Java的互操作性。它几乎可以运行在任何Java语言可以运行的地方&#xff0c;但相比Java&#xff0c;Kotlin更加简洁、…

Hive 数据倾斜

1.什么是数据倾斜 数据倾斜&#xff1a;数据分布不均匀&#xff0c;造成数据大量的集中到一点&#xff0c;造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近&#xff0c;查看任务监控页面&#xff0c;发现只有少量 reduce 子任务未完成&#xff0c;因为其处理…

Python赋值运算符

目录 赋值运算符 将值赋给变量&#xff1a; 做加法运算之后完成赋值&#xff1a; 做减法运算之后完成赋值&#xff1a;- 做乘法运算之后完成赋值&#xff1a;* 做除法运算之后完成赋值&#xff1a;/ 做整除运算之后完成赋值&#xff1a;// 做幂次运算之后完成赋值&#xff1a;*…

Java常见排序

1、冒泡排序&#xff08;从小到大排序&#xff09; 相邻的元素两两比较&#xff0c;小的放左边&#xff0c;大的放右边 第一轮比较完毕之后&#xff0c;最大值就已经确定了&#xff0c;第二轮比第一轮少循环一次&#xff0c;后面以此类推 如果数据中有n个数据&#xff0c;我…

Pytorch 计算深度模型的大小

计算模型大小的方法 卷积 时间复杂度 与 空间复杂度 的计算方式&#xff1a; C 通道的个数&#xff0c;K卷积核大小&#xff0c;M特征图大小&#xff0c;C_l-1是输入通道的个数&#xff0c;C_l是输出通道的个数 1 模型大小 MB 计算模型的大小的原理就是计算保存模型所需要…

每天学习一个Linux命令之grpck

每天学习一个Linux命令之grpck 简介 在Linux系统中&#xff0c;grpck是一个非常有用的命令&#xff0c;它的主要功能是检查和修复组文件&#xff08;/etc/group&#xff09;的完整性和一致性。本篇博客将详细介绍grpck命令及其所有可用选项的用法。 命令语法 grpck [选项] …

在MySQL中isnull()函数不能作为替代null值!

在MySQL中isnull()函数不能作为替代null值&#xff01; 如下&#xff1a; 首先有个名字为business的表&#xff1a; SELECT ISNULL(business_name,no business_name) AS bus_isnull FROM business WHERE id2 直接运行就会报错&#xff1a; 错误代码&#xff1a; 1582 Incor…

cuDNN-Graph API

Graph API 为了适应越来越重要的算子融合需求&#xff0c;cuDNN8.0版本引入了Graph API&#xff0c;以提供更灵活的API接口。Graph API提供一个声明式的编程模型&#xff0c;此模型将计算操作描述为计算图。 用户首先需要构建操作图。从高层面来说&#xff0c;用户其实是在描…

Swift - Playground

文章目录 Swift - Playground1. 新建Playground2. View3. 图片4. ViewController5. Playground - 多Page6. 注释6.1 Playground的注释支持markup语法&#xff08;与markdown相似&#xff09;6.1.1 语法 Swift - Playground Playground可以快速预览代码效果&#xff0c;是学习语…

设计模式(九):组合模式

设计模式&#xff08;九&#xff09;&#xff1a;组合模式 1. 组合模式的介绍2. 组合模式的类图3. 组合模式的实现 1. 组合模式的介绍 组合模式&#xff08;Composite Pattern&#xff09;属于结构型模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。 组合模式依据…

基于SpringBoot+Vue校园二手交易系统的设计与实现

系统介绍 自从新冠疫情爆发以来&#xff0c;各个线下实体越来越难做&#xff0c;线下购物的人也越来越少&#xff0c;随之带来的是一些不必要的浪费&#xff0c;尤其是即将毕业的大学生&#xff0c;各种用品不方便携带走导致被遗弃&#xff0c;造成大量的浪费。本系统目的就是让…

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台浏览管理界面图&#xff0c;通过内容列表可以获取网…

PotatoPie 4.0 实验教程(41) —— FPGA实现RISC-V 扩展 GPIO UART Timer功能

TD工程介绍 我们提供的TD工程里的RISC-V核默认就开启了GPIO UART扩展&#xff0c;可以看到还有SPI和I2C扩展。因此后面的实验中TD的工程我们基本不怎么修改TD的内容&#xff0c;只需要修改TD工具中Soc_Top.v文件中的TCM0_INITFILE为FD生成的固件名称即可&#xff0c;主要修我以…

智慧校园-自动化办公管理系统要素

在如今&#xff0c;一个学校的自动化办公系统的完成程度已经成为衡量这个学校的信息化管理标准之一了。自友智慧校园所研发的自动化办公管理系统能使学校内部的人员能够方便、快捷的共享信息&#xff0c;从而高校的协同工作。这样就改变了过去那种复杂、低效的手工办公方式&…