news 2026/6/10 18:14:59

Spring Cloud Gateway 请求限流配置示例:使用 Redis 实现令牌桶算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Cloud Gateway 请求限流配置示例:使用 Redis 实现令牌桶算法

本文介绍一个Spring Cloud Gateway 的请求限流配置,使用 Redis 实现令牌桶算法。

一、YAML 配置解析

application.ymlspring:cloud:gateway:routes:-id:user-serviceuri:lb://user-servicepredicates:-Path=/api/users/**filters:-name:RequestRateLimiterargs:redis-rate-limiter.replenishRate:10# 每秒10个redis-rate-limiter.burstCapacity:20# 突发20个key-resolver:"#{@userKeyResolver}"# 按用户限流

1. 路由配置

routes:-id:user-serviceuri:lb://user-service# 目标服务(负载均衡)predicates:-Path=/api/users/**# 匹配的路径filters:-name:RequestRateLimiter# 启用限流过滤器

2. 限流参数

args:redis-rate-limiter.replenishRate:10# 令牌生成速率:10个/秒redis-rate-limiter.burstCapacity:20# 令牌桶容量:20个key-resolver:"#{@userKeyResolver}"# 限流维度:按用户

令牌桶算法原理:

  • 系统以固定速率(10个/秒)生成令牌放入桶中
  • 桶最多存放20个令牌(应对突发流量)
  • 请求到达时,从桶中取一个令牌
  • 如果桶空,则拒绝请求(429 Too Many Requests)

二、Java 配置解析

@ConfigurationpublicclassRateLimitConfig{@BeanpublicKeyResolveruserKeyResolver(){returnexchange->{// 按用户ID限流StringuserId=exchange.getRequest().getHeaders().getFirst("X-User-ID");returnMono.just(userId!=null?userId:"anonymous");};}@BeanpublicKeyResolverapiKeyResolver(){returnexchange->{// 按API路径限流Stringpath=exchange.getRequest().getPath().value();returnMono.just(path);};}}

1. KeyResolver Bean

@BeanpublicKeyResolveruserKeyResolver(){returnexchange->{StringuserId=exchange.getRequest().getHeaders().getFirst("X-User-ID");returnMono.just(userId!=null?userId:"anonymous");};}

作用:根据请求头中的X-User-ID区分不同用户进行限流。如果未提供,则归为 “anonymous” 用户组。

2. 另一个备用解析器

@BeanpublicKeyResolverapiKeyResolver(){returnexchange->{Stringpath=exchange.getRequest().getPath().value();returnMono.just(path);// 按API路径限流};}

说明:这个解析器可以用于按API路径限流,但当前配置使用的是userKeyResolver

三、工作流程

请求流程: 1. 用户访问 /api/users/123 2. Gateway 提取 X-User-ID 头(如 "user-001") 3. 检查 Redis 中 "user-001" 的令牌桶 4. 如果有令牌 → 转发到 user-service 5. 如果无令牌 → 返回 429 错误

四、限流效果示例

假设有3个用户:

  • 用户A(X-User-ID: user1):频繁访问
  • 用户B(X-User-ID: user2):偶尔访问
  • 匿名用户:未传 X-User-ID

结果:

  • 每个用户独立限流(每秒最多10个请求)
  • 用户之间互不影响
  • 突发流量最多支持20个请求(超过后按10个/秒匀速处理)

五、Redis 数据结构

Gateway 会在 Redis 中创建键值对:

request_rate_limiter.{userId}.tokens # 剩余令牌数 request_rate_limiter.{userId}.timestamp # 最后更新时间

六、实际应用场景

  1. 防止恶意请求:限制单个用户频繁调用
  2. 保护后端服务:避免突发流量打垮服务
  3. 公平使用:确保每个用户都有机会访问
  4. 分级限流:可通过配置不同限流规则实现VIP/普通用户区别对待

七、自定义扩展

可以修改KeyResolver实现更复杂的限流策略:

  • 按IP地址限流
  • 按用户等级动态调整限流阈值
  • 结合时间段的动态限流
  • 白名单用户不限流
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:59:23

2026企业AI数字资产管理平台评测:谁在定义下一代无形资产?

当传统数字资产(域名、数据库、社媒账号)成为企业标配,一种更隐秘的竞争已悄然展开——AI数字资产。它决定了品牌能否被大模型“记住”、如何被描述、是否被优先推荐,甚至影响企业估值。德勤报告指出,这类资产或将占企…

作者头像 李华
网站建设 2026/6/10 15:03:05

基于 YOLOv8 的常见鸟类智能识别系统实战|从数据集到可视化应用的完整落地方案

基于 YOLOv8 的常见鸟类智能识别系统实战|从数据集到可视化应用的完整落地方案 一、项目背景与研究意义 鸟类是生态系统中最具代表性的指示物种之一,其种群数量、分布变化往往直接反映生态环境的健康状况。在自然保护区监测、生物多样性调查、校园科普…

作者头像 李华
网站建设 2026/6/10 12:35:12

基于 YOLOv8 的反光衣智能检测系统设计与实现—从数据集构建到 PyQt5 可视化部署的完整实践

基于 YOLOv8 的反光衣智能检测系统设计与实现 一、项目背景与研究意义 在城市夜间施工、道路巡检、工地作业等高风险场景中,反光衣是保障人员安全的核心防护装备之一。然而,在实际管理过程中,仍大量依赖人工巡查方式进行穿戴监管&#xff0…

作者头像 李华
网站建设 2026/6/9 18:33:52

智慧园区系统:开启园区数字化变革新时代

在科技引领发展的当下,智慧园区系统作为创新的结晶,正深度改变着园区的运作模式。它集合前沿科技之力,从管理、服务、能耗及安全等多个维度,为园区打造出全面智能化的发展路径,引领园区迈向全新的数字化时代。接下来&a…

作者头像 李华
网站建设 2026/5/14 7:35:18

IDEA回滚已推送的代码到指定commit

第一步:本地分支回滚到指定commit 找到要回滚的commit,右键菜单选择“Reset Current Branch to Here…”。先回滚本地分支代码,确认回滚没问题后,下一步强制推送本地分支代码。 第二步:强制推送已回滚的分支 git p…

作者头像 李华
网站建设 2026/6/9 16:06:33

PHP vs Python:Web开发与多面手的终极对决

语言类型与设计理念PHP是一种专为Web开发设计的脚本语言,早期主要嵌入HTML中实现动态网页功能,语法设计偏向于快速解决Web问题。Python是一种通用编程语言,强调代码可读性和简洁性,适用于Web开发、数据分析、人工智能等多个领域。…

作者头像 李华