本文介紹Ocelot中的限流,限流允許Api閘道器控制一段時間內特定api的總訪問次數。
限流的使用非常簡單,只需要新增配置即可。
1、新增限流
修改 configuration.json
配置檔案,對 UpstreamPathTemplate
為 /webapib/values
的配置修改如下:
{
"UpstreamPathTemplate": "/webapib/values",
"UpstreamHttpMethod": [ "Get" ],
"RateLimitOptions": {
"ClientWhiteList": [
"myclient"
],
"EnableRateLimiting": true,
"Period": "1m",
"PeriodTimespan": 30,
"Limit": 2
}
}
對 RateLimitOptions
中幾個配置項做下解釋:
-
ClientWhiteList:一個字串陣列,在請求頭中包含ClientId=xxx的請求不受限流控制,其中ClientId這個key可以修改,後邊會介紹,xxx表示配置的白名單。
-
EnableRateLimiting:Boolean值,是否啟用限流,只有為true時,配置生效。
-
Period:限流控制的時間段,可以輸入 1s(1秒),1m(1分),1h(1小時),1d(1天)類似的值,以此類推。
-
PeriodTimespan:超過限流限制的次數後,需要等待重置的時間(單位是秒)。
-
Limit:在Period時間內最大能訪問的數量。
用一句話描述一下上邊的配置:對於除了請求頭中包含ClientId=myclient的請求啟用限流,1分鐘之內該api最多被訪問2次,如果已經達到2次,從第2次請求結束起30秒後才能進行下一次訪問。
分別執行WebApiB和OcelotGetWay,使用Postman以get方式請求連結http://localhost:5000/webapib/values,如下所示:
再看一下未達到限制的response essay-header和達到限制的response essay-header:
可以看到在未達到限制時的essay-header會傳回前面配置的Perid和剩餘請求次數。
在達到限制時的essay-header會傳回剩餘多長時間(秒)重置。
再次用Postman以get的方式請求http://localhost:5000/webapib/values,不過此次要新增essay-header:
多次請求後同樣可以請求到資料,並沒有受到限流配置影響。
2、全域性配置
同時在全域性配置中可以新增一些關於限流的配置來控制是否在response essay-header中傳回限流相關的資訊,以及限流的傳回信息和狀態碼還有ClientIdHeader。
修改 GlobalConfiguration
如下:
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8500
},
"RateLimitOptions": {
"DisableRateLimitHeaders": true,
"QuotaExceededMessage": "Stop request plz!",
"HttpStatusCode": 999,
"ClientIdHeader": "cid"
}
}
重新執行Ocelot Api閘道器,請求連結如下:
傳回信息中不再包含限流相關資訊。
當達到限流時,傳回的資訊以及狀態碼也會根據配置發生變化:
細心的同學可能已經發現,在上邊的兩次請求中都添加了essay-header ClientId=myclient,但是還是受到了限流控制,這是因為我們在上邊的全域性配置中已經將ClientId修改為cid,修改essay-header資訊重新訪問,就不會再受到限流控制:
相關文章:
原文地址:https://www.jianshu.com/p/f62ca68e26f2
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com