【发布时间】:2022-01-18 08:13:31
【问题描述】:
我将在我的 Spring Web 应用程序中引入 Bucket4J。可以在此处找到基本测试设置:
Bucket4J 提供基于 IP 的速率限制 - 因此每个 IP 都有自己的令牌池。这可以通过在配置中添加expression: "getRemoteAddress()" 来完成:
bucket4j:
enabled: true
filters:
- metrics:
types:
- consumed-counter
- rejected-counter
- cache-name: buckets
filter-method: webflux
url: .*
filter-order: 1
rate-limits:
- bandwidths:
- capacity: 1
time: 10
unit: seconds
expression: "getRemoteAddress()"
我很难弄清楚如何以编程方式测试filter by IP 是否正常工作。
单个IP的测试如下:
@ActiveProfiles("test")
@SpringBootTest
class RateLimitTest(
@Autowired val context: ApplicationContext
) {
@Test
fun `FAILS with status code 429 if rate limit is exceeded`() {
// arrange
val client = WebTestClient
.bindToApplicationContext(context)
.configureClient()
.build()
// ac
client.get()
.uri("/api/someendpoint")
.exchange()
.expectStatus().isOk
.expectHeader().valueEquals("X-Rate-Limit-Remaining", "0")
client.get()
.uri("/api/someendpoint")
.exchange()
.expectStatus().isEqualTo(HttpStatus.TOO_MANY_REQUESTS)
.expectBody().jsonPath("error", "Too many requests!")
// assert
}
验证多个 IP 的行为/IP 速率限制的测试应该是什么样的?FAILS with status code 429 if rate limit * for IP * is exceeded
【问题讨论】:
标签: spring-webflux webtestclient bucket4j