SpringBoot使用自定义注解+AOP+Redis实现接口限流

为什么要限流

系统在设计的时候,我们会有一个系统的预估容量,长时间超过系统能承受的TPS/QPS阈值,系统有可能会被压垮,最终导致整个服务不可用。为了避免这种情况,我们就需要对接口请求进行限流。

所以,我们可以通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统或避免不必要的资源浪费,一旦达到限制速率则可以拒绝服务、排队或等待。

限流背景

系统有一个获取手机短信验证码的接口,因为是开放接口,所以为了避免用户不断的发送请求获取验证码,防止恶意刷接口的情况发生,于是用最简单的计数器方式做了限流,限制每个IP每分钟只能请求一次,然后其他每个手机号的时间窗口限制则是通过业务逻辑进行判断。一般一些接口访问量比较大的,可能会压垮系统的,则需要加入流量限制!如:秒杀等…

实现限流

1、引入依赖

2、自定义限流注解

3、限流切面

4、写一个简单的接口进行测试

5、全局异常拦截

6、接口测试

1)第一次发送,正常返回结果

2)一分钟内第二次发送,返回错误,限流提示

好了,大功告成啦

还有其他的限流方式,如滑动窗口限流方式(比计数器更严谨)、令牌桶等…,有兴趣的小伙伴可以学习一下

附源码

Original: https://www.cnblogs.com/jae-tech/p/16625091.html
Author: Jae1995
Title: SpringBoot使用自定义注解+AOP+Redis实现接口限流

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621592/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上

    概述 定义 特性 名词 模块组成 部署 建议配置 下载 部署规划 前置准备工作 准备启动环境 修改配置文件 初始化数据库 启动 DolphinScheduler 实战使用 监控中心…

    Java 2023年6月5日
    073
  • 如何下载 blob 地址的视频资源

    如何下载视频资源以blob:http开头的资源 一、问题场景 想下载知乎视频资源,却发现视频链接是这个样子的 blob:https://v.vzuu.com/b6146956-6e…

    Java 2023年6月9日
    0102
  • Java问题排解

    1. 新安装的jdk11,竟然发现没有自动安装jre,运行程序不能运行。 2. 关于eclipse Installed JREs 添加 jdk10.0.2时,提示”Ta…

    Java 2023年5月29日
    063
  • Jenkins Shared Library 添加第三方包支持

    我们在写 Jenkins 的 Shared Library 时,有时候需要引用外部的一些 jar 包,比如 maven central 的一些 lib 等。具体到我们的例子,需要引…

    Java 2023年6月9日
    067
  • java学习之多线程

    0x00前言和思维导图 1.什么是进程?什么事线程?我们可以这样理解,一个qq相当于一个进程,你同时间跟几个人聊qq你每一个聊天框就相当于线程(线程就是进程的每一个执行场景/执行单…

    Java 2023年6月13日
    070
  • go thrift 开发

    thrift 从 0.9.1版本开始,可以完美支持 go 语言,可以完美的实现跨语言的 rpc 调用了。下面以 go 和 java 语言相互调用为例。 编辑协议文件,go 语言示例…

    Java 2023年6月6日
    083
  • 白话电子签章原理及风险

    因为业务需要近来在对接一个线上的电子签章平台, 签完的效果就是在PDF上盖一个红色的章。内部过程沟通中发现,对这个红色章背后的证明逻辑,技术原理,能够了解的比较清楚的人还是很少的。…

    Java 2023年6月15日
    091
  • 2.5W 字详解线程与锁了,面试随便问

    在 java 并发编程中,线程和锁永远是最重要的概念。语言规范虽然是规范描述,但是其中也有非常多的知识和最佳实践是值得学习的,相信这篇文章还是可以给很多读者提供学习参考的。 本文主…

    Java 2023年6月5日
    079
  • 图解不同版本的HTTP协议

    前言 大家好,我是蜗牛,今天我们聊聊HTTP协议,通过这篇文章我们能了解到不同版本HTTP优缺点、他们之间的性能差异以及现在主流的HTTP协议用的那个版本 HTTP/1.1 时代 …

    Java 2023年6月15日
    089
  • SpringBoot 2.x 开发案例之前后端分离鉴权

    前言 阅读本文需要一定的前后端开发基础,前后端分离已成为互联网项目开发的业界标准使用方式,通过 Nginx代理+Tomcat的方式有效的…

    Java 2023年5月30日
    077
  • MySQL里的那些日志们

    该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sq…

    Java 2023年6月7日
    060
  • EasyExcel使用心得

    最近项目中用到&#…

    Java 2023年6月13日
    063
  • 戏说领域驱动设计(九)——架构模式

    本节开始进入DDD的战术阶段,首先要讲解的必然是DDD中的架构,毕竟程序员就喜欢这个……不过这里的架构不同于我们常说的微服务架构、单体架构、无服务架构或服务…

    Java 2023年6月7日
    081
  • Spring Cloud体系实现标签路由

    如果你正在使用Spring Cloud体系,在实际使用过程中正遇到以下问题,可以阅读本文章的内容作为后续你解决这些问题的参考,文章内容不保证无错,请务必仔细思考之后再进行实践。 问…

    Java 2023年6月14日
    079
  • SpringBoot2.3.12.RELEASE优雅的全局异常处理(模板一)

    参考:https://www.cnblogs.com/xuwujing/p/10933082.html 1、首先,需要引入maven依赖包,如下所示: 1 "1.0&qu…

    Java 2023年5月30日
    081
  • 【java多线程】jdk的线程池

    一、JDK的线程池的核心参数 int corePoolSize :线程池中的核心线程数 int maximumPoolSize :线程池中的最大线程数 long keepAlive…

    Java 2023年5月29日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球