Annotation Interface RateLimit


@Target({TYPE,METHOD}) @Retention(RUNTIME) @Documented public @interface RateLimit
接口限流注解

标记在Controller方法或类上,表示需要进行限流控制

主要功能: 1. 限制单位时间内的请求次数 2. 支持多种限流算法(令牌桶、滑动窗口、固定窗口) 3. 支持多种限流维度(用户ID、IP、接口)

使用示例:

// 按IP限流,每分钟60个请求(key 默认即 #ip)
@RateLimit(permitsPerMinute = 60)
@PostMapping("/api/login")
public Result login(HttpServletRequest request) {
}

// 按请求参数限流,每秒10个请求(#xxx 取 query/表单参数值)
@RateLimit(key = "#mobile", permitsPerSecond = 10)
@PostMapping("/api/sms/send")
public Result sendSms(@RequestParam String mobile) {
}

// 固定key限流,每小时10次(普通字符串为固定key,所有请求共享限流桶)
@RateLimit(key = "order:create", permitsPerHour = 10, algorithm = RateLimitAlgorithm.SLIDING_WINDOW, message = "操作过于频繁,请1小时后再试")
@PostMapping("/api/order")
public Result createOrder() {
}

key 语义(H8 修正,非 SpEL):

  • #ip:内置快捷方式,按客户端 IP 限流(默认值)
  • #参数名:按请求 query/表单参数值限流(参数缺失时记录 warn 日志并回退为按接口 URI 限流)
  • 普通字符串:固定 key(所有请求共享同一限流桶)
Author:
Kerbores(kerbores@riemann.tech)
  • Element Details

    • key

      String key
      限流key

      语义(非 SpEL,H8 修正):

      • "#ip":内置快捷方式,按客户端 IP 限流(默认值)
      • "#参数名":按请求 query/表单参数值限流,如 "#userId" 取参数 userId 的值; 参数缺失时记录 warn 日志并回退为按接口 URI 限流
      • "固定字符串":固定 key,所有请求共享同一限流桶,如 "api:order"
      Returns:
      限流key表达式,默认#ip
      Default:
      "#ip"
    • permitsPerSecond

      double permitsPerSecond
      每秒允许的请求数
      Returns:
      每秒请求数,默认0(不启用)
      Default:
      0.0
    • permitsPerMinute

      int permitsPerMinute
      每分钟允许的请求数
      Returns:
      每分钟请求数,默认0(不启用)
      Default:
      0
    • permitsPerHour

      int permitsPerHour
      每小时允许的请求数
      Returns:
      每小时请求数,默认0(不启用)
      Default:
      0
    • algorithm

      限流算法
      Returns:
      限流算法,默认令牌桶
      Default:
      TOKEN_BUCKET
    • limitType

      LimitType limitType
      限流类型
      Returns:
      限流类型,默认按用户
      Default:
      CUSTOMER
    • message

      String message
      自定义错误提示
      Returns:
      错误提示信息
      Default:
      "\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5"