当前位置: 首页 > ops >正文

RequestRateLimiterGatewayFilterFactory

一、功能说明

RequestRateLimiterGatewayFilterFactory 是 Spring Cloud Gateway 的流量控制组件,用于实现 API 请求速率限制,核心功能包括:

  1. 限制单位时间内的请求数量(如每秒10次)
  2. 防止服务被突发流量击垮(通过令牌桶算法)
  3. 支持分布式限流(依赖Redis存储)
  4. 可自定义限流维度(按IP、用户ID等)

二、工作原理图

1. 动态流程(时序图)
客户端 API网关 Redis 后端服务 请求 /api/data 1. 调用KeyResolver获取Key(如IP) 2. 返回当前令牌数 3. 扣减令牌 4. 转发请求 返回数据 200 OK 429 Too Many Requests alt [令牌充足] [令牌不足] 客户端 API网关 Redis 后端服务
2. 静态架构(类图)
调用
依赖
读写令牌
RequestRateLimiterGatewayFilterFactory
+apply(Config config)
RedisRateLimiter
-replenishRate: int
-burstCapacity: int
+isAllowed()
«interface»
KeyResolver
+resolve(exchange)
RequestRateLimiter
Redis

三、示例

1. 配置示例(application.yml)
spring:cloud:gateway:routes:- id: rate-limit-routeuri: http://backend-servicepredicates:- Path=/api/**filters:- name: RequestRateLimiterargs:redis-rate-limiter:replenishRate: 10  # 每秒生成10个令牌burstCapacity: 20  # 令牌桶容量key-resolver: "#{@ipKeyResolver}"  # 按IP限流
2. 自定义KeyResolver
@Bean
public KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
3. 触发限流时的响应
HTTP/1.1 429 Too Many Requests
X-RateLimit-Remaining: 0
X-RateLimit-Retry-After: 1
Content-Type: application/json{"error": "Too many requests","message": "You have exhausted your API request quota"
}

四、关键机制解析

组件作用
RedisRateLimiter基于令牌桶算法实现限流,依赖Redis存储计数
KeyResolver定义限流维度(如IP、用户ID、API路径等)
replenishRate令牌填充速率(如10=每秒10个请求)
burstCapacity突发流量容量(允许短时间内超过replenishRate的最大值)

五、应用场景

  1. 防御CC攻击:限制单个IP的疯狂刷接口行为
  2. API分级管控:为VIP用户分配更高的请求配额
  3. 服务降级:在系统高负载时主动限流保核心功能

如果需要更复杂的限流策略(如滑动窗口、漏桶算法),可以自定义实现 RateLimiter 接口。

http://www.xdnf.cn/news/10672.html

相关文章:

  • 亚马逊Woot提报常见问题第一弹
  • es 的字段类型(text和keyword)
  • PostgreSQL的扩展 passwordcheck
  • 深入剖析物联网边缘计算技术:架构、应用与挑战
  • 学习threejs,交互式神经网络可视化
  • 基于Java的OPCDA采集中间件
  • Vue.js教学第十八章:Vue 与后端交互(二):Axios 拦截器与高级应用
  • Windows 下部署 SUNA 项目:虚拟环境尝试与最终方案
  • 下载并运行自制RAG框架
  • C# winform教程(二)----button
  • Python文件操作与JSON处理完全指南
  • Python训练第四十三天
  • 从计量到通信,DJSF1352-D为快充桩系统提供了怎样的解决方案?
  • Java基础(二):八种基本数据类型详解
  • 内网横向之RDP缓存利用
  • 三大中文wordpress原创主题汉主题
  • 动态规划--每日一练(LIS+层级法)
  • BAT脚本编写详细教程
  • 【LeetCode 热题100】动态规划实战:打家劫舍、完全平方数与零钱兑换(LeetCode 198 / 279 / 322)(Go语言版)
  • 云服务器无法远程连接怎么办?
  • Playwright 测试框架 - Node.js
  • 代码随想录|动态规划|47判断子序列
  • 从Docker拉取镜像一直失败超时解决办法
  • 现代汽车电气/电子(E/E)架构集中化评估的系统方法
  • win主机如何结束正在执行的任务进程并重启
  • CVE-2021-28169源码分析与漏洞复现(Jetty信息泄露)
  • 基于springboot的民间文化艺术品销售系统
  • 调整数据集的方法
  • 达芬奇(DaVinci Resolve)下载安装教程
  • 关闭函数闭包的理解