广告
您当前的位置: 首页 >  技术 >  编程开发

服务网关:解密 Spring Cloud Gateway 基于 Redis 令牌桶的限流原理

作者:CoderWang 时间:2026-07-07 阅读数:2人阅读

在微服务架构的流量入口处,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 核心看家本领!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

CoderWang

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信