SpringBoot + Redis实现对接口的限流

目录

前言

什么是限流?

实现限流

创建一个注解类

接着创建一个切面类


前言

在项目中,对于接口的限流,是任何项目都必不可少的一部分,主要是为了防止用户频繁的发送请求,对服务器造成压力。

另外一点就是防止外来攻击,对服务器也会造成压力,所以才衍生出了需要对接口进行限流访问的次数

什么是限流?

限流通俗来讲就是限制流量大小,这里的流量并不是指我们平常手机上的流量,这里的流量指的是,用户每一次刷新网页时对服务器发送一次请求,就是一次流量。

我们通过限流,来防止用户过多刷新网页,平常我们也会看到一些网页,发送验证码过多次数,他就会提示你请稍后再发送。

实现限流

我们这里使用springBoot的AOP切面编程,来对接口进行限流操作

创建一个注解类

我们先创建一个注解类,因为对于AOP切面编程来说,集成注解模式是最好的解决方案

这里定义了两个参数

一个允许被访问的次数,是自定义的

还有一个默认的60秒,是在一段时间内进行限流多少次

package com.sxy.recordnetwork.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 设置访问次数限制的注解*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {int count(); // 允许被访问的次数int seconds() default 60; // 时间范围,秒为单位,表示在60秒内访问的次数}

接着创建一个切面类

主要的逻辑就是,在标注了这个注解类AccessLimit的方法上执行的AOP切面,在方法执行之前

我们通过JoinPoint对象,获取到目标方法名,以方法名作为唯一的key

接着获取注解里的参数,为次数和时间

key为方法名:值为访问次数

对它进行一定的判断,然后每一次访问这个接口都会调用decrement这个方法,对key对应的值(访问次数)进行自减操作

package com.sxy.recordnetwork.aspect;import com.sxy.recordnetwork.Exception.Son.ApiRateLimitExceedException;
import com.sxy.recordnetwork.annotation.AccessLimit;
import com.sxy.recordnetwork.enumeration.Constants;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** 设置访问次数限制的AOP切面*/
@Aspect
@Component
@Slf4j
public class AccessLimitAspect {@Autowired // redisprivate RedisTemplate redisTemplate;// 添加一个前置通知,在方法执行之前执行 切入点为满足添加了这个AccessLimit注解的方法@Before("@annotation(accessLimit)")public void AccessLimitBefore(JoinPoint joinPoint, AccessLimit accessLimit) {// 获取注解的属性// 通过joinPoint获取目标方法名String methodName = joinPoint.getSignature().getName();// 设置一下redis的访问ValueOperations valueOperations = redisTemplate.opsForValue();// 获取注解属性Integer count = accessLimit.count(); //  访问次数int seconds = accessLimit.seconds(); // 在一定时间内// 设置初始值,如果不存在则设置,存在则不设置,返回一个boolean,设置了就为true,否则是falseBoolean isNew = valueOperations.setIfAbsent(methodName, count - 1, seconds, TimeUnit.SECONDS);// 判断是旧的keyif (!isNew) {// 如果键存在,获取当前值并且递减Integer currentCount = (Integer) valueOperations.get(methodName);// 次数小于等于0就是访问次数超出限制if (currentCount != null && currentCount <= 0) {throw new ApiRateLimitExceedException(Constants.FREQUENT_VISITS.getValue());} else {// 递减valueOperations.decrement(methodName, 1);}}}
}

在控制层就这么添加注解,count就是访问的次数

这样就实现了一个简单的对接口进行限流

以上就是今天分享的内容,对接口进行限流,如有问题,欢迎在下方评论区留言,感谢大家的支持,给个三连呗~🍒

欢迎大家关注我的微信公众号,里面分享了更多的开发技巧

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

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

相关文章

C++之第八课

课程列表 今天我们来学一学C里的一些实用的东西。 1.域宽 说到域宽setw&#xff0c;就叒要加头文件了。 #include<iomanip> 使用格式是&#xff1a; cout<<setw(5)<<"123"; setw括号里面可以改数字&#xff0c;后面就是输出内容了&#xff…

COD论文笔记 Boundary-Guided Camouflaged Object Detection

动机 挑战性任务&#xff1a;伪装物体检测&#xff08;COD&#xff09;是一个重要且具有挑战性的任务&#xff0c;因为伪装物体往往与背景高度相似&#xff0c;使得准确识别和分割非常困难。现有方法的不足&#xff1a;现有的深度学习方法难以有效识别伪装物体的结构和细节&am…

MySQL索引、视图练习

素材 1.学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 2.课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 3.学生选课表&#xff1a;SC (Sno…

Home Credit - Credit Risk Model Stability

本篇是对Kaggle上Home Credit - Credit Risk Model Stability竞赛中的开源代码VotingClassifier Home Credit的解读。原链接在VotingClassifier Home Credit (kaggle.com)。 %%writefile script.py import sys from pathlib import Path import subprocess import os import g…

人工智能的发展现状,AI将如何改变IT行业,哪些职业将最先失业

文章目录 一、人工智能的发展现状1、技术进展与突破2、商业应用与市场3、挑战与问题4、未来趋势 二、AI将如何改变IT行业1、工作方式的转变&#xff1a;2、未来发展的推动&#xff1a;3、用户服务和体验的提升&#xff1a;4、创新和转型的推动&#xff1a;5、融入日常生活和工作…

浅谈JMeter运行原理

浅谈JMeter运行原理 JMeter架构基础 JMeter基于Java平台开发&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;之上。这意味着它可以在任何支持JVM的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。其核心架构设计围绕着多线程执行机制&#xff0c;这使得它…

AI大模型探索之路-实战篇6: Function Calling技术调研之详细流程剖析

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;DB-GPT数据应用开发框架调研实践 AI大模型探索之路-实战篇5&#xff1a; Open Interpreter开放代码解释器调研实践 目录 系列篇章&#x1f4a5;一、前言二、Function Calling详细流程剖析1、创建OpenAI客户端2、定…

PCL 法向量加权的RANSAC拟合分割平面

目录 一、算法原理1、原理概述2、主要函数二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、原理概述

鸿蒙布局List简介

鸿蒙布局List简介 List--常见的布局容器List 创建方式创建方式一&#xff0c;通过Listitem创建方式二&#xff0c;通过ForEach和Listitem创建方式三&#xff0c;通过ListItemGroup List–常见的布局容器 List是在app开发中最常见的一种布局方式&#xff0c;例如通讯录、新闻列…

Wpf 使用 Prism 实战开发Day24

自定义询问窗口 当需要关闭系统或进行删除数据或进行其他操作的时候&#xff0c;需要询问用户是否要执行对应的操作。那么就需要一个弹窗来给用户进行提示。 一.添加自定义询问窗口视图 (MsgView.xaml) 1.首先&#xff0c;添加一个自定义询问窗口视图 (MsgView.xaml) <Use…

域内攻击 ----->约束非约束委派攻击

在域中&#xff0c;除了我们常见的横向移动以外&#xff0c;还有很多攻击&#xff0c;像什么kerberoasting&#xff0c;委派攻击&#xff0c;NTLMrelay啊...... 还有很多&#xff08;暂时只知道这些&#xff09; 以前在一篇公众号看到的一个笑话也荟萃了网安的一些攻击手法&am…

vscode终端运行pnpm,yarn不成功问题

vscode终端运行pnpm&#xff0c;yarn不成功问题 1.问题描述2.解决办法 1.问题描述 全局安装了pnpm后&#xff0c;cmd窗口执行pnpm -v可以查看版本信息&#xff0c;在项目目录可以执行操作&#xff0c;但是在vscode中无法执行并报错 2.解决办法 以管理员身份运行vscode打开vscod…

《拯救大学生课设不挂科第二期之Windows11下安装VC6.0(VC++6.0)与跑通Hello World C语言程序教程》【官方笔记】

背景与目标人群&#xff1a; 大学第一次学C语言的时候&#xff0c;大部分老师会选择VC6这个编辑器。 但由于很多人是新手&#xff0c;第一次上大学学C语言。 老师要求VC6.0&#xff08;VC6.0&#xff09;写C语言跑程序可能很多人还是第一次接触电脑。 需要安装VC6这个编辑器…

深入理解ECMAScript:JavaScript的规范与实践

引言 在当今的Web开发领域&#xff0c;JavaScript几乎无处不在。它不仅在客户端编程中占据主导地位&#xff0c;而且在服务器端&#xff08;Node.js&#xff09;和移动应用开发中也越来越受欢迎。然而&#xff0c;JavaScript的核心并非由单一的公司或组织控制&#xff0c;而是…

初识Java--开启我的Java学习之旅

目录 一、JAVA语言概述二、JAVA语言的重要性2.1语言使用广泛程度2.2工作领域2.3在校招岗位的需求2.4 java语言发展简史2.5Java语言特性 三、初识java的main方法四、运行java程序五、【面试题】JDK、JRE、JVM之间的关系&#xff1f; 一、JAVA语言概述 Java是一种优秀的程序设计…

【Apache Doris】周FAQ集锦:第 4 期

【Apache Doris】周FAQ集锦&#xff1a;第 4 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

Redis常见数据类型(6)-set, zset

目录 Set 命令小结 内部编码 使用场景 用户画像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ​编辑 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小结 …

链栈的存储

单向链表在栈中的存储 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //链栈初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判断链栈是否为空 Status StackEmpty(LinkStack S) {if (S NU…

将具有传统IP的设计迁移到Vivado设计套件

将具有传统IP的设计迁移到Vivado设计套件 概述 AMD Vivado™设计套件允许您从CORE Generator™工具迁移IP设计。你可以 还可以将IP迁移到Vivado Design Suite的最新版本。 重要&#xff01;Vivado集成开发环境&#xff08;IDE&#xff09;要求IP、实例化和 端口名都是小写的。将…