Skip to content

接口限流拦截器 🚦

功能介绍 💡

WARNING

接口限流拦截器就像一个智能红绿灯系统,通过令牌桶算法来控制接口访问流量,支持集群限流。它能有效防止系统被过度访问,保护系统稳定运行。

限流方式 🔄

限流类型类型值说明应用场景
全局限流all针对所有请求进行限流控制系统总体访问量
令牌限流authorization基于用户令牌的限流控制单个用户访问频率
IP限流ip基于访问者IP的限流防止单IP频繁访问
商户限流merchant基于商户身份的限流控制商户API调用量
接口限流path基于接口路径的限流保护特定接口不被滥用

详细配置说明 ⚙️

核心参数说明

参数名类型必填默认值说明
enabledbooleanfalse是否启用限流器
rulesarray[object]-限流规则列表

限流规则配置详解 (rules)

参数名类型必填默认值说明
typearray[string]-限流类型(可多选组合)
urlsarray[string]-需要限流的URL地址列表
replenish-ratefloat1.0令牌产生速率(个/秒)
burst-capacityfloat10.0令牌桶容量
requested-tokensfloat1.0每次请求消耗令牌数
restorebooleanfalse是否允许重置令牌

配置示例 📋

1. 全局限流配置

yaml
# 全局限流配置示例
gateway:
  filter:
    rate-limiter:
      enabled: true
      rules: 
        - type:  # 全局限流
            - all
          urls:  # 限流路径
            - /demo/**
          replenish-rate: 1  # 每秒产生1个令牌
          burst-capacity: 1  # 令牌桶容量1个
          requested-tokens: 1  # 每次请求消耗令牌数

2. 接口级别限流

yaml
# 接口级别限流配置示例
gateway:
  filter:
    rate-limiter:
      enabled: true
      rules: 
        - type:  # 按接口路径限流
            - path
          urls: 
            - /demo/**
          replenish-rate: 1  # 每个接口每秒1次请求
          burst-capacity: 1
          requested-tokens: 1  # 每次请求消耗令牌数

3. 多维度组合限流

yaml
# 多维度组合限流配置示例
gateway:
  filter:
    rate-limiter:
      enabled: true
      rules: 
        - type: 
            - path
            - authorization  # 同时按路径和令牌限流
          urls: 
            - /demo/**
          replenish-rate: 1
          burst-capacity: 1
          requested-tokens: 1

4. 自定义时间窗口限流

yaml
# 自定义时间窗口限流配置示例
gateway:
  filter:
    rate-limiter:
      enabled: true
      rules: 
        - type: 
            - path
            - authorization
          urls: 
            - /demo/**
          replenish-rate: 1  # 每秒产生1个令牌
          burst-capacity: 60  # 最多存储60个令牌
          requested-tokens: 60  # 每次请求消耗60个令牌(相当于每分钟允许1次请求)

5. 完整多规则配置

yaml
# 完整的多规则限流配置示例
gateway:
  filter:
    rate-limiter:
      enabled: true
      rules:
        # 高频API限流(严格限制)
        - type:
            - path
            - authorization
          urls:
            - /api/payment/**
            - /api/order/**
          replenish-rate: 0.5  # 每2秒产生1个令牌
          burst-capacity: 5    # 令牌桶容量5个
          requested-tokens: 1  # 每次请求消耗1个令牌
          restore: false       # 不允许重置令牌
        
        # 普通API限流(中等限制)
        - type:
            - path
          urls:
            - /api/user/**
            - /api/product/**
          replenish-rate: 2    # 每秒产生2个令牌
          burst-capacity: 10   # 令牌桶容量10个
          requested-tokens: 1  # 每次请求消耗1个令牌
          restore: true        # 允许重置令牌
        
        # IP限流(防止单IP攻击)
        - type:
            - ip
          urls:
            - /api/**
          replenish-rate: 10   # 每秒产生10个令牌
          burst-capacity: 50   # 令牌桶容量50个
          requested-tokens: 1  # 每次请求消耗1个令牌
        
        # 商户限流(按商户限制)
        - type:
            - merchant
          urls:
            - /merchant/api/**
          replenish-rate: 5    # 每秒产生5个令牌
          burst-capacity: 20   # 令牌桶容量20个
          requested-tokens: 1  # 每次请求消耗1个令牌
        
        # 全局限流(系统保护)
        - type:
            - all
          urls:
            - /**
          replenish-rate: 100  # 每秒产生100个令牌
          burst-capacity: 500  # 令牌桶容量500个
          requested-tokens: 1  # 每次请求消耗1个令牌

6. 不同业务场景配置

yaml
# 不同业务场景的限流配置
gateway:
  filter:
    rate-limiter:
      enabled: true
      rules:
        # 登录接口限流(防暴力破解)
        - type:
            - ip
            - path
          urls:
            - /auth/login
            - /auth/register
          replenish-rate: 0.1  # 每10秒产生1个令牌
          burst-capacity: 3    # 令牌桶容量3个
          requested-tokens: 1  # 每次请求消耗1个令牌
        
        # 验证码接口限流
        - type:
            - ip
          urls:
            - /auth/captcha
            - /auth/sms
          replenish-rate: 0.2  # 每5秒产生1个令牌
          burst-capacity: 5    # 令牌桶容量5个
          requested-tokens: 1  # 每次请求消耗1个令牌
        
        # 文件上传限流
        - type:
            - authorization
          urls:
            - /file/upload/**
          replenish-rate: 0.5  # 每2秒产生1个令牌
          burst-capacity: 3    # 令牌桶容量3个
          requested-tokens: 2  # 每次请求消耗2个令牌
        
        # 搜索接口限流
        - type:
            - authorization
            - ip
          urls:
            - /search/**
          replenish-rate: 1    # 每秒产生1个令牌
          burst-capacity: 10   # 令牌桶容量10个
          requested-tokens: 1  # 每次请求消耗1个令牌

响应头说明 📋

当请求被限流处理后,网关会在响应头中添加以下信息:

响应头名称说明示例值
X-RateLimit-Remaining当前剩余可用令牌数5
X-RateLimit-Replenish-Rate令牌生成速率(每秒)1.0
X-RateLimit-Burst-Capacity令牌桶最大容量10.0
X-RateLimit-Requested-Tokens本次请求消耗的令牌数1.0
X-RateLimit-Restore-Code限流恢复码(仅在开启恢复功能时返回)550e8400-e29b-41d4-a716-446655440000

TIP

  • 通过响应头信息可以了解当前限流状态
  • 可根据剩余令牌数调整请求频率
  • 限流恢复码可用于特殊场景下的限流解除

最佳实践 💡

  1. 限流策略选择

    • 优先考虑业务场景需求
    • 合理设置令牌生成速率
    • 根据接口重要性设置不同策略
  2. 性能优化建议

    • 避免过于频繁的限流检查
    • 合理设置令牌桶容量
    • 注意集群环境的同步问题
  3. 监控和告警

    • 监控限流情况
    • 设置限流告警阈值
    • 定期分析限流日志

常见问题 ❓

  1. 请求被限流

    • 检查当前限流规则配置
    • 验证令牌桶容量是否合理
    • 确认是否存在突发流量
  2. 限流不生效

    • 确认限流器是否启用
    • 检查URL匹配规则
    • 验证限流类型配置
  3. 令牌消耗过快

    • 检查令牌生成速率
    • 优化请求频率
    • 调整令牌桶容量

安全提示 ⚠️

CAUTION

  1. 合理配置限流阈值,避免影响正常业务
  2. 关注限流日志,及时发现异常访问
  3. 考虑设置限流告警机制
  4. 定期评估和调整限流策略

相关文档 📚