Gateway 限流到底限了什么?key 从哪里来?为什么没配 KeyResolver 全部 403?多个网关实例会不会各限各的?Redis 挂了限流器是放行还是挡住?这篇在 Spring Cloud Gateway 5.0.3 上接一个自己起的 Redis,一个个量出来。
状态码序列 [200, 200, 200, 200, 200, 429, 429, 429, 429, 429];后端收到 5 个请求
第 1 个响应的限流头 {'remaining': '4', 'requested-tokens': '1', 'burst-capacity': '5', 'replenish-rate': '2'};第 5 个 {'remaining': '0', 'requested-tokens': '1', 'burst-capacity': '5', 'replenish-rate': '2'};第 6 个(被拒绝){'remaining': '0', 'requested-tokens': '1', 'burst-capacity': '5', 'replenish-rate': '2'}
Redis 里的 key:['request_rate_limiter.{r1.alice}.timestamp', 'request_rate_limiter.{r1.alice}.tokens'];tokens 的 TTL = 5 秒
等 1.1 秒后再发 4 个:[200, 200, 429, 429]
另一个用户 bob 紧接着发 6 个:[200, 200, 200, 200, 200, 429]容量与补充速率;响应头带剩余令牌;Redis 键带路由 id。
没有配置 KeyResolver bean(用默认的 PrincipalNameKeyResolver,请求没有登录用户)→ HTTP 403 加 deny-empty-key=false → HTTP 200 KeyResolver 取 X-User,请求不带 X-User → HTTP 403;加 status-code=SERVICE_UNAVAILABLE 后被限流的状态码序列 [200, 200, 200, 200, 200, 503, 503]
拿不到 key 返回 403,可以关闭;状态码可改。
连续 6 个请求:[200, 200, 429, 429, 429, 429]
限流头 {'remaining': '1', 'requested-tokens': '2', 'burst-capacity': '5', 'replenish-rate': '2'}每个请求消耗多个令牌。
交替发给两个实例的 10 个请求:[200, 200, 200, 200, 200, 429, 429, 429, 429, 429];后端收到 5 个
计数在 Redis,多个实例共享。
[默认的 Redis 命令超时] Redis 正常时第一个请求 200(0.2s);Redis 停掉之后连续 3 个请求 ['超时(>12s)', '超时(>12s)', '超时(>12s)'];后端收到 0 个 [spring.data.redis.timeout=1s] Redis 正常时第一个请求 200(0.2s);Redis 停掉之后连续 3 个请求 ['200(1.1s)', '200(1.1s)', '200(1.1s)'];后端收到 3 个
默认卡住请求,配 Redis 超时后放行。