SpringBoot请求限流(RateLimiter)

发布于:2025-06-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

简介

本文详细介绍了基于Spring AOPRedis实现的限流器完整实现原理,包括核心组件、配置方式、使用方法和最佳实践。通过本文,你将全面了解限流器的实现细节和设计思想。

目录

项目背景

在分布式系统中,限流是一个非常重要的功能,它可以保护系统免受突发流量的冲击,确保系统的稳定性和可用性。本项目实现了一个基于Spring AOP和Redis的分布式限流器,具有以下特点:

  1. 声明式使用,通过注解即可实现限流
  2. 支持分布式环境下的限流
  3. 可自定义限流策略和key生成规则
  4. 高性能,基于Redis实现
  5. 易于集成和使用

核心组件详解

1. RateLimiter注解

@Target({
   ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimiter {
   
    // 限流的时间,默认为 1 秒
    int time() default 1;

    // 时间单位,默认为 SECONDS 秒
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    // 限流次数
    int count() default 100;

    // 提示信息,请求过快的提示
    String message() default "";

    // 使用的 Key 解析器
    Class<? extends RateLimiterKeyResolver> keyResolver() default DefaultRateLimiterKeyResolver.class;

    // 使用的 Key 参数
    String keyArg() default "";
}

注解参数说明:

  • time: 限流时间窗口,默认为1秒
  • timeUnit: 时间单位,默认为秒
  • count: 在时间窗口内允许的最大请求数,默认为100
  • message: 超出限流时的自定义错误消息
  • keyResolver: 自定义key解析器类,默认为DefaultRateLimiterKeyResolver
  • keyArg: 自定义key解析的参数

2. RateLimiterAspect切面

package com.erp.common.ratelimiter.core.aop;

import cn.hutool.core.util.StrUtil;
import com.erp.common.enums.AppExceptionCodeMsg;
import com.erp.common.exception.AppException;
import com.erp.common.ratelimiter.core.annotation.RateLimiter;
import com.erp.common.ratelimiter.core.keyresolver.RateLimiterKeyResolver;
import com.erp.common.ratelimiter.core.redis.RateLimiterRedisDAO;
import com.erp.common.utils.CollectionUtils;
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.util.Assert;

import java.util.List;
import java.util.Map