前言
通過上節介紹“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 驗證限流
- 運行網關項目“Yak.Ocelot.Gateway”。
2. 通過網關訪問天氣預報。
3. 驗證限流
一分鐘內第6次訪問接口“http://localhost:5000/weather”時,被限制訪問了。
2.4 全局配置
- 修改網關全局配置,配置如下:
{ "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確實很方便。