首页 > 解决方案 > 基于同一路由的多个键的速率限制

问题描述

我们使用 spring-cloud-gateway 来限制使用 RedisRateLimiter 的速率。如果我们有一个键来限制每条路线的速率,那么一切都是开箱即用的。但是,我们有一个用例,其中针对单个给定路线。我们想通过多层进行速率限制。例如,对于给定的路由 id 1,我们希望将池中的某个用户的速率限制为每秒 10 个请求。但是,与此同时,我们还希望将同一路由的整体池请求速率限制为每秒 100 个。所以基本上对同一条路线使用 2 个不同的键,同时同时跟踪每个键。

我们尝试使用速率限制器过滤器,但我们无法在配置中声明多个速率限制器。我们还尝试使用以下内容:

    spring.cloud.gateway:
        routes:
        - id: 1
            uri: https://example.org/
        predicates:
        - Path=/path
        filters:
        - name: RequestRateLimiter
            args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                key-resolver: "#{@userKeyResolver}"
        - name: RequestRateLimiter
            args:
                redis-rate-limiter.replenishRate: 100
                redis-rate-limiter.burstCapacity: 200
                key-resolver: "#{@poolKeyResolver}"

在上面的描述中,池中可以有多个用户。因此,用户的速率应限制为每秒 10 个请求的补充速率,而整体池的速率应限制为每秒 100 个的补充速率。但是由于使用了相同的过滤器,因此速率限制器的第一个配置被第二个覆盖。

我们查看了以下帖子,建议了一种基于独立于路由的用户计划的速率限制方法:基于 Spring Cloud Gateway 中的用户计划的速率限制

但是,这不适用于我们的用例,因为它的速率限制基于给定的 API 密钥,与路由无关。有没有办法我们可以使用 Spring 云网关来实现这一点。任何可以让我们支持这个用例的配置。

标签: rate-limitingspring-cloud-gateway

解决方案


推荐阅读