W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
redis實(shí)現(xiàn)基于Stripe所做的工作。它需要使用spring-boot-starter-data-redis-reactive
Spring Boot起動(dòng)器。
使用的算法是令牌桶算法。
redis-rate-limiter.replenishRate
是您希望用戶每秒允許多少個(gè)請(qǐng)求,而沒(méi)有任何丟棄的請(qǐng)求。這是令牌桶被填充的速率。
redis-rate-limiter.burstCapacity
是允許用戶在一秒鐘內(nèi)執(zhí)行的最大請(qǐng)求數(shù)。這是令牌桶可以容納的令牌數(shù)。將此值設(shè)置為零將阻止所有請(qǐng)求。
通過(guò)在replenishRate
和burstCapacity
中設(shè)置相同的值可以達(dá)到穩(wěn)定的速率。通過(guò)將burstCapacity
設(shè)置為高于replenishRate
,可以允許臨時(shí)突發(fā)。
在這種情況下,速率限制器需要在突發(fā)之間間隔一段時(shí)間(根據(jù)replenishRate
),因?yàn)?個(gè)連續(xù)的突發(fā)將導(dǎo)致請(qǐng)求丟失(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")); }
這定義了每個(gè)用戶10的請(qǐng)求速率限制。允許20個(gè)突發(fā),但是下一秒只有10個(gè)請(qǐng)求可用。KeyResolver
是一個(gè)簡(jiǎn)單的參數(shù),它獲取user
請(qǐng)求參數(shù)(注意:不建議在生產(chǎn)中使用)。
速率限制器也可以定義為實(shí)現(xiàn)RateLimiter
接口的bean。在配置中,使用SpEL通過(guò)名稱引用bean。#{@myRateLimiter}
是一個(gè)SpEL表達(dá)式,引用名稱為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}"
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: