Ocelot系列文章---限流(Rate Limiting)

 

前言

通過上節介紹“Ocelot快速實踐”後,瞭解了Ocelot網關,作爲網關,要有很多功能才能滿足要求,如訪問量比較大時怎麼限制呢?這節介紹限流(Rate Limiting)。

環境:

 

VS2022 +.NET5.0 + Ocelot 17.0.0.0

 

 

一、Ocelot限流(Rate Limiting)

很多時候爲了防止DoS攻擊,我們會通過限流方式對上游請求進行限制,以保護下游服務不會負荷過載,爲客戶端提供高質量的資源服務。在Ocelot限流項目示例中,通過APIGateway項目路由RateLimitOptions選項可以配置限流。

1.1 RateLimitOptions選項幾個參數

  • ClientWhitelist:客戶端白名單。名單中的客戶端不會被限流。
  • EnableRateLimiting:是否啓用限流。
  • Period:限流時間(1s,5m,1h,1d)。在限流時間內限制請求數,需要等PeriodTimespan時間過去了,才能再次發起請求。
  • PeriodTimespan:限流時間間隔,限流後多少秒後纔可以再次發起請求。
  • Limit:限制請求數。
  • DisableRateLimitHeaders:是否禁用X-Rate-Limit和Retry-After標頭。
  • QuotaExceededMessage:限流返回的消息。
  • HttpStatusCode:限流時候,指定返回的HTTP狀態代碼。
  • ClientIdHeader:允許您指定應用於標識客戶端的標頭。默認情況下爲“ClientId”。

 

 

 

二、項目演示

在上節“Ocelot快速實踐”項目基礎上進行改造,在一分鐘只容許5次訪問,項目機構。

 

 

 

2.1 運行接口服務

運行接口服務項目“Yak.Ocelot.Api”。

 

 

 

2.2 修改Ocelot網關配置

 配置如下:

{

  "Routes": [

    {

      "DownstreamPathTemplate": "/WeatherForecast",

      "DownstreamScheme": "http",

      "DownstreamHostAndPorts": [

        {

          "Host": "localhost",

          "Port": 6000

        }

      ],

      "UpstreamPathTemplate": "/Weather",

      "UpstreamHttpMethod": [ "Get" ],

      "RateLimitOptions": {

        "ClientWhitelist": [ "admin" ], //客戶端白名單。名單中的客戶端不會被限流。

        "EnableRateLimiting"true// 是否啓用限流

        "Period""1m"// 限流時間(1s,5m,1h,1d)。在限流時間內限制請求數,需要等PeriodTimespan時間過去了,才能再次發起請求。

        "PeriodTimespan": 15, // 多少秒之後客戶端可以重試

        "Limit": 5 // 在統計時間段內允許的最大請求數量

      }

    }

    

  ],

  "GlobalConfiguration": {

    "BaseUrl": "http://localhost:5000"

  }

}

 

 

2.3 驗證限流

  1. 運行網關項目“Yak.Ocelot.Gateway”。

 

 

 

2. 通過網關訪問天氣預報。

 

 

 

3. 驗證限流

一分鐘內第6次訪問接口“http://localhost:5000/weather”時,被限制訪問了。

 

 

 

 

2.4 全局配置

  1. 修改網關全局配置,配置如下:

{

  "Routes": [

    {

      "DownstreamPathTemplate": "/WeatherForecast",

      "DownstreamScheme": "http",

      "DownstreamHostAndPorts": [

        {

          "Host": "localhost",

          "Port": 6000

        }

      ],

      "UpstreamPathTemplate": "/Weather",

      "UpstreamHttpMethod": [ "Get" ],

      "RateLimitOptions": {

        "ClientWhitelist": [ "admin" ], //客戶端白名單。名單中的客戶端不會被限流。

        "EnableRateLimiting": true, // 是否啓用限流

        "Period": "1m", // 限流時間(1s,5m,1h,1d)。在限流時間內限制請求數,需要等PeriodTimespan時間過去了,才能再次發起請求。

        "PeriodTimespan": 15, // 多少秒之後客戶端可以重試

        "Limit": 5 // 在統計時間段內允許的最大請求數量

      }

    }

    

  ],

  "GlobalConfiguration": {

    "BaseUrl": "http://localhost:5000",

    "RateLimitOptions": {

      "DisableRateLimitHeaders"false// Http頭  X-Rate-Limit 和 Retry-After 是否禁用

      "QuotaExceededMessage""Interface access is frequent"// 當請求過載被截斷時返回的消息

      "HttpStatusCode": 999, // 當請求過載被截斷時返回的http status

      "ClientIdHeader""client_id" // 用來識別客戶端的請求頭,默認是 ClientId

    }

 

  }

}

 

2.再次運行網關“Yak.Ocelot.Gateway”項目,接口訪問第6次時顯示如下。1分鐘之內超過5次,便會被截斷,直接返回截斷後的消息提示,HttpStatusCode:999。

 

 

 

 

 

三、 總結

通過咋網關上進行配置,很好地達到了限制訪問量的目的,Ocelot確實很方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章