一个网页就能黑掉你的电脑:OpenCode 曝远程代码执行漏洞 GHSA-632h-h47v-g4x4,开发者需立即升级
2026/9/30 16:55:05
本文介绍一个Spring Cloud Gateway 的请求限流配置,使用 Redis 实现令牌桶算法。
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}"# 按用户限流routes:-id:user-serviceuri:lb://user-service# 目标服务(负载均衡)predicates:-Path=/api/users/**# 匹配的路径filters:-name:RequestRateLimiter# 启用限流过滤器args:redis-rate-limiter.replenishRate:10# 令牌生成速率:10个/秒redis-rate-limiter.burstCapacity:20# 令牌桶容量:20个key-resolver:"#{@userKeyResolver}"# 限流维度:按用户令牌桶算法原理:
@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);};}}@BeanpublicKeyResolveruserKeyResolver(){returnexchange->{StringuserId=exchange.getRequest().getHeaders().getFirst("X-User-ID");returnMono.just(userId!=null?userId:"anonymous");};}作用:根据请求头中的X-User-ID区分不同用户进行限流。如果未提供,则归为 “anonymous” 用户组。
@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个用户:
X-User-ID: user1):频繁访问X-User-ID: user2):偶尔访问结果:
Gateway 会在 Redis 中创建键值对:
request_rate_limiter.{userId}.tokens # 剩余令牌数 request_rate_limiter.{userId}.timestamp # 最后更新时间可以修改KeyResolver实现更复杂的限流策略: