Spring Cloud Redis RateLimiter
redis实现基于Stripe所做的工作。它需要使用spring-boot-starter-data-redis-reactive
Spring Boot起动器。
使用的算法是令牌桶算法。
redis-rate-limiter.replenishRate
是您希望用户每秒允许多少个请求,而没有任何丢弃的请求。这是令牌桶被填充的速率。
redis-rate-limiter.burstCapacity
是允许用户在一秒钟内执行的最大请求数。这是令牌桶可以容纳的令牌数。将此值设置为零将阻止所有请求。
通过在replenishRate
和burstCapacity
中设置相同的值可以达到稳定的速率。通过将burstCapacity
设置为高于replenishRate
,可以允许临时突发。
在这种情况下,速率限制器需要在突发之间间隔一段时间(根据replenishRate
),因为2个连续的突发将导致请求丢失(HTTP 429 - Too Many Requests
)。
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
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。
application.yml。
spring: cloud: gateway: routes: - id: requestratelimiter_route uri: https://example.org filters: - name: RequestRateLimiter args: rate-limiter: "#{@myRateLimiter}" key-resolver: "#{@userKeyResolver}"
更多建议: