当前位置:   article > 正文

SpringBoot + Redis 实现接口限流,一个注解的事

SpringBoot + Redis 实现接口限流,一个注解的事

Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了~今天想和小伙伴们聊聊用 Redis 处理接口限流。

1. 准备工作

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

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.boot</groupId>
  7.     <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>
  9. <dependency>
  10.     <groupId>org.springframework.boot</groupId>
  11.     <artifactId>spring-boot-starter-aop</artifactId>
  12. </dependency>

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

  1. spring.redis.host=localhost
  2. spring.redis.port=6379
  3. spring.redis.password=123

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

2. 限流注解

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

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

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

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

  1. public enum LimitType {
  2.     /**
  3.      * 默认策略全局限流
  4.      */
  5.     DEFAULT,
  6.     /**
  7.      * 根据请求者IP进行限流
  8.      */
  9.     IP
  10. }

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

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface RateLimiter {
  5.     /**
  6.      * 限流key
  7.      */
  8.     String key() default "rate_limit:";
  9.     /**
  10.      * 限流时间,单位秒
  11.      */
  12.     int time() default 60;
  13.     /**
  14.      * 限流次数
  15.      */
  16.     int count() default 100;
  17.     /**
  18.      * 限流类型
  19.      */
  20.     LimitType limitType() default LimitType.DEFAULT;
  21. }

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

<
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/351590
推荐阅读
相关标签
  

闽ICP备14008679号