|
Redis 实现基于 Stripe 完成的工作。它需要使用 spring-boot-starter-data-redis-reactive Spring Boot starter。
使用的算法是令牌桶算法。
redis-rate-limiter.replenishRate 属性定义每秒允许多少请求(没有任何丢弃的请求)。这是令牌桶填充的速度。
redis-rate-limiter.burstCapacity 属性是用户在一秒内允许的最大请求数(没有任何丢弃的请求)。这是令牌桶可以容纳的令牌数量。将此值设置为零会阻止所有请求。
redis-rate-limiter.requestedTokens 属性是每个请求消耗多少令牌。这是从令牌桶中为每个请求取出的令牌数量,皇冠默认为 1。
通过在 replenishRate 和 burstCapacity 中设置相同的值可以实现稳定的速率。通过将 burstCapacity 设置高于 replenishRate 可以允许临时突发。在这种情况下,限流器需要在突发之间留出一些时间(根据 replenishRate),DG游戏因为连续两次突发会导致请求被丢弃(HTTP 429 - Too Many Requests)。以下列表配置了一个 redis-rate-limiter
通过将 replenishRate 设置为期望的请求数,将 requestedTokens 设置为以秒为单位的时间跨度,欧博注册并将 burstCapacity 设置为 replenishRate 和 requestedTokens 的乘积,可以实现低于 1 request/s 的速率限制。例如,欧博代理设置 replenishRate=1,requestedTokens=60,欧博官网和 burstCapacity=60 会导致 1 request/min 的限制。 .application.yml
spring: cloud: gateway: routes: - id: requestratelimiter_route uri: https://example.org filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 redis-rate-limiter.requestedTokens: 1
以下示例在 Java 中配置 KeyResolver
Config.java @Bean KeyResolver userKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); }
这定义了每个用户每秒 10 个请求的速率限制。允许一次突发 20 个请求,但在下一秒只能获得 10 个请求。KeyResolver 是一个简单的实现,它获取 user 请求参数 注意:不建议用于生产环境
您还可以将实现 RateLimiter 接口的 bean 定义为限流器。在配置中,您可以使用 SpEL 按名称引用该 bean。#{@myRateLimiter} 是一个 SpEL 表达式,引用名为 myRateLimiter 的 bean。以下列表定义了一个使用前一个列表中定义的 KeyResolver 的限流器
application.yml spring: cloud: gateway: routes: - id: requestratelimiter_route uri: https://example.org filters: - name: RequestRateLimiter args: rate-limiter: "#{@myRateLimiter}" key-resolver: "#{@userKeyResolver}" (责任编辑:) |
