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.pswp.cn/web/15182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15182.shtml
英文地址,請注明出處:http://en.pswp.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、實例化和 端口名都是小寫的。將…