SpringBoot Redis用注释实现接口限流详解

作者:叶秋学长 时间:2022-03-15 17:40:55 

1. 准备工作

首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后提前准备好一个 Redis 实例,这里我们项目配置好之后,直接配置一下 Redis 的基本信息即可,如下:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123

好啦,准备工作就算是到位了。

2. 限流注解

接下来我们创建一个限流注解,我们将限流分为两种情况:

  • 针对当前接口的全局性限流,例如该接口可以在 1 分钟内访问 100 次。

  • 针对某一个 IP 地址的限流,例如某个 IP 地址可以在 1 分钟内访问 100 次。

针对这两种情况,我们创建一个枚举类:

public enum LimitType {
   /**
    * 默认策略全局限流
    */
   DEFAULT,
   /**
    * 根据请求者IP进行限流
    */
   IP
}

接下来我们来创建限流注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter {
   /**
    * 限流key
    */
   String key() default "rate_limit:";
   /**
    * 限流时间,单位秒
    */
   int time() default 60;
   /**
    * 限流次数
    */
   int count() default 100;
   /**
    * 限流类型
    */
   LimitType limitType() default LimitType.DEFAULT;
}

第一个参数限流的 key,这个仅仅是一个前缀,将来完整的 key 是这个前缀再加上接口方法的完整路径,共同组成限流 key,这个 key 将被存入到 Redis 中。

另外三个参数好理解,我就不多说了。

来源:https://blog.csdn.net/m0_63722685/article/details/125637507

标签:SpringBoot,Redis,接口,限流
0
投稿

猜你喜欢

  • C#判断一个字符串是否是数字或者含有某个数字的方法

    2022-05-07 14:38:17
  • 详解ArrayList的扩容机制

    2022-06-18 05:56:32
  • Java安全框架——Shiro的使用详解(附springboot整合Shiro的demo)

    2022-05-29 09:46:46
  • 使用纯Java实现一个WebSSH项目的示例代码

    2023-03-11 11:32:20
  • Springboot - Fat Jar示例详解

    2023-11-19 21:28:35
  • 简单了解Java编程中线程的创建与守护线程

    2023-11-25 06:59:52
  • Idea里github的图形化操作配置方法

    2021-12-29 15:03:17
  • java控制台输出图书馆管理系统

    2022-06-13 01:29:29
  • 深入了解java.util.Arrays的使用技巧

    2023-01-10 18:01:32
  • Java异常处理中同时有finally和return语句的执行问题

    2022-08-14 15:28:30
  • SpringBoot注解梳理(小结)

    2023-11-10 13:27:19
  • Swagger实现动态条件注入与全局拦截功能详细流程

    2023-11-23 13:41:05
  • 被kafka-client和springkafka版本坑到自闭及解决

    2023-08-23 15:07:36
  • Java中类的定义与实例化详解

    2022-10-25 23:18:43
  • Jenkins一键打包部署SpringBoot应用

    2022-08-03 16:37:18
  • flutter中使用流式布局示例详解

    2023-08-24 23:49:06
  • MTK Android平台开发流程

    2023-06-23 08:59:11
  • 通过Mybatis实现单表内一对多的数据展示示例代码

    2021-12-20 12:34:31
  • Spring整合Dubbo框架过程及原理解析

    2022-01-31 01:49:16
  • java POI解析Excel 之数据转换公用方法(推荐)

    2023-06-10 11:04:53
  • asp之家 软件编程 m.aspxhome.com