Gateway 網關 之 限流


可以利用Gateway中RequestRateLimiter實現限流

常見的限流算法

1、計數器算法

以QPS(每秒查詢率Queries-per-second)為100舉例。

從第一個請求開始計時。每個請求讓計數器加一。當到達100以后,其他的請求都拒絕。

如果1秒鍾內前200ms請求數量已經到達了100,后面800ms中500次請求都被拒絕了,這種情況稱為“突刺現象”

 

2、漏桶算法

和生活中漏桶一樣,有一個水桶,下面有一個”漏眼”往出漏水,不管桶里有多少水,漏水的速率都是一樣的。但是既然是一個桶,桶里裝的水都是有上限的。當到達了上限新進來的水就裝不了(主要出現在突然倒進來大量水的情況)。漏桶算法可以解決突刺現象。

 

3、令牌桶算法

令牌桶算法可以說是對漏桶算法的一種改進。

在桶中放令牌,請求獲取令牌后才能繼續執行。如果桶中沒有令牌,請求可以選擇進行等待或者直接拒絕。

由於桶中令牌是按照一定速率放置的,所以可以一定程度解決突發訪問。如果桶中令牌最多有100個,qps最大為100

 

 

 


案例:

Gateway中限流,RequestRateLimiter是基於Redis和Lua腳本實現的令牌桶算法

配置:

配置文件屬性參考:RequestRateLimiterGatewayFilterFactory及內部類 Config,RateLimiter,KeyResolver 的字段

 

spring:
  cloud:
    gateway:
      routes:
        - id: member-demo
          uri: lb://my-member
          predcates:
            - name: Path
              args:
                - patterns=/member/**,/my-member/**
          
          filters:  
            # 配置令牌桶
            - name: RequestRateLimiter
              args:
                # 配置類:RateLimiter 實現類 RedisRateLimiter 對象
                redis-rate-limiter:
                  defaultRateLimiter:
                    defaultConfig:
                      # 每秒生成令牌個數
                      replenishRate: 1
                      # 令牌桶上線容量
                      burstCapacity: 5
 
                    # 自定義一個 keyResolver 實現 KeyResolver MyKeyResolver,注入容器,使用Spring的EL表達式讀取值
                    defaultKeyResolver: '#{@myKeyResolver}'
 
  # 令牌桶使用到 Redis ,需要配置Redis連接屬性
  redis:
    host: behelpful-redis
    port: 6379
    password: behelpful@8888

 


自定義令牌桶規則:

just() 方法參數表示根據什么進行限流。實例中是根據主機名進行限流。參數值影響Redis

@Component
public class MyKeyResolver implements KeyResolver {
   /**
    * <String> 字符串泛型,代表令牌分給誰,可以是IP地址也可以是數字字符串,如果返回 "1",表示所有客戶端一表只有一個令牌
    *
    * @param exchange
    * @return
    */
   @Override
   public Mono<String> resolve(ServerWebExchange exchange) {
      ServerHttpRequest request = exchange.getRequest();
      String remoteAddr = request.getRemoteAddress().getAddress().getHostAddress();
      // 對每個客戶端IP進行限流
      return Mono.just(remoteAddr);
   }
}

 

>>>>>>>>>>>>> 下一篇: https://www.cnblogs.com/Alay/p/15150554.html   <<<<<<<<<<<<<<<<<<<<<<


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM