服务网关:解密 Spring Cloud Gateway 基于 Redis 令牌桶的限流原理
在微服务架构的流量入口处,API 网关扮演着极其关键的安全守卫角色。为了防止恶意爬虫刷单、突发高并发流量压垮后端微服务,网关必须具备高性能、分布式的**入口级流量限流(Rate Limiting)**能力。
Spring Cloud Gateway 内置提供了一个基于 Redis 实现的限流过滤器 RequestRateLimiterGatewayFilterFactory。它采用经典的**令牌桶(Token Bucket)算法**,并通过 **Lua 脚本** 保证了在 Redis 分布式环境下的高并发原子性操作。
本文将系统拆解分布式令牌桶算法原理、网关内置 Lua 脚本执行逻辑、以及 KeyResolver 动态流控键的配置实战。
一、 核心概念:令牌桶算法的三大核心参数
令牌桶算法在应对突发流量(Bursty Traffic)时表现极佳,其行为由以下三个核心参数定义:
| 限流核心参数 | 物理定义说明 | 默认行为与控制规律 |
|---|---|---|
| 1. Replenish Rate (令牌填充率) | 每秒钟向令牌桶中放入的令牌个数。 | 定义了系统能够长期稳定处理的**最大持续 QPS 上限**。 |
| 2. Burst Capacity (桶容量) | 令牌桶的最大容量上限。 | 定义了系统允许的**最大突发瞬时流量**。如果桶满,可瞬时通过此数量的请求。 |
| 3. Requested Tokens (消耗令牌数) | 单次请求需要消耗的令牌个数。 | 通常为 1。 |
二、 Gateway 令牌桶限流与 Redis-Lua 同步拓扑
当一个外部请求注入 Spring Cloud Gateway 时,网关与分布式 Redis 之间的限流判定拓扑如下:
[ 外部客户端请求 (如 GET /api/v1/orders) ]
│
▼ 1. 匹配路由,进入限流过滤器
[ RequestRateLimiterGatewayFilterFactory ]
│
▼ 2. 解析限流 Key (如客户端 IP / 用户 Token)
[ KeyResolver (限流键解析器) ]
│
▼ 3. 携带参数执行 Redis 内部 Lua 脚本
[ Redis 数据库集群 ]
│
【 内置 Lua 脚本运行 】
├─ 4. 计算自上一次请求后应自动填充的令牌数
├─ 5. 判断当前可用令牌数是否足够
│
├─ (足够) ──> 6. 扣减令牌 ──> 返回 1 (允许放行)
└─ (不足) ──> 返回 0 (拒绝请求)
│
┌──────────────┴──────────────┐
(允许) (拒绝)
▼ ▼
[ 转发给后端订单微服务 ] [ 7. 响应 HTTP 429 Too Many Requests ]
---三、 代码实战:在网关配置基于 IP 的分布式令牌桶限流
以下展示了如何在 Spring Cloud Gateway 中,编写基于请求 IP 进行限流的 KeyResolver,并在配置文件中进行激活装配:
1. 自定义限流键解析器(Java Config)
package com.company.infra.gateway.limiter;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.*;
import reactor.core.publisher.Mono;
import java.util.Objects;
@Configuration
public class GatewayLimiterConfiguration {
/**
* 根据请求者的 HostAddress (客户端 IP) 进行限流隔离
*/
@Bean
@Primary
public KeyResolver ipKeyResolver() {
return exchange -> Mono.just(
Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress()
);
}
}
2. 在 application.yml 装配网关过滤器规则
spring:
cloud:
gateway:
routes:
- id: order-service-route
uri: lb://order-service
predicates:
- Path=/api/v1/orders/**
filters:
# 引入内置限流过滤器
- name: RequestRateLimiter
args:
# 1. 引用上述定义的 ipKeyResolver Bean
key-resolver: "#{@ipKeyResolver}"
# 2. 令牌桶容量:允许瞬时最大突发 10 个请求
redis-rate-limiter.burstCapacity: 10
# 3. 令牌填充率:每秒允许稳定通过 5 个请求
redis-rate-limiter.replenishRate: 5
redis:
# 限流数据存放的目标 Redis 物理地址
host: 8.163.59.247
port: 6379
password: redis_password_secret
---四、 总结
Spring Cloud Gateway 的 Redis 令牌桶限流与 KeyResolver 解析机制,是微服务网络边界防护的第一道“钢铁长城”。
It 通过**基于 Redis-Lua 脚本的分布式原子操作,完美解决了网关集群部署下限流计数不准的行业死穴,达成了高并发下的绝对精确控制;并依靠令牌桶算法的慢冲特性,平滑消化了突发洪峰流量**。掌握这套网关限流机制与 Lua 脚本交互逻辑,是进行高可用微服务网格防护、保障后端核心数据库不受突发流量冲击 of 核心看家本领!
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。



暂无评论
还没有人评论过本文,快来发表你的高见吧!