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

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

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. 针对当前接口的全局性限流,例如该接口可以在 1 分钟内访问 100 次。

  2. 针对某一个 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 中。

<

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 06:16:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 06:16:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 06:16:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 06:16:01       20 阅读

热门阅读

  1. AJAX:XHR(XMLHttpRequest)与Fetch的区别与使用

    2024-04-02 06:16:01       15 阅读
  2. 了解监控易(14):中间件监控

    2024-04-02 06:16:01       15 阅读
  3. 766. 托普利茨矩阵

    2024-04-02 06:16:01       14 阅读
  4. MT4数据分析:如何利用历史数据指导未来投资

    2024-04-02 06:16:01       14 阅读
  5. 设计模式(13):模板方法模式

    2024-04-02 06:16:01       17 阅读
  6. .net core 3.1 MySqlHelper(自用)

    2024-04-02 06:16:01       14 阅读
  7. 【Kotlin】匿名类和伴生类

    2024-04-02 06:16:01       17 阅读
  8. 基于mqtt的物联网控制移动应用程序开发

    2024-04-02 06:16:01       16 阅读
  9. Android RecycleView 缓存 itemView 提高滑动流畅度

    2024-04-02 06:16:01       15 阅读
  10. 做题目

    2024-04-02 06:16:01       17 阅读
  11. Android BLE蓝牙扫描系统源码解析学习笔记

    2024-04-02 06:16:01       16 阅读