Spring Cloud RequestRateLimiter GatewayFilter工廠

2024-01-04 17:48 更新

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ò)在replenishRateburstCapacity中設(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}"


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)