本文介紹Ocelot中的限流,限流允許Api網(wǎng)關(guān)控制一段時(shí)間內(nèi)特定api的總訪問次數(shù)。
限流的使用非常簡單次屠,只需要添加配置即可。
1雳刺、添加限流
修改 configuration.json
配置文件劫灶,對(duì) UpstreamPathTemplate
為 /webapib/values
的配置修改如下:
{
// ...
"UpstreamPathTemplate": "/webapib/values",
"UpstreamHttpMethod": [ "Get" ],
"RateLimitOptions": {
"ClientWhiteList": [
"myclient"
],
"EnableRateLimiting": true,
"Period": "1m",
"PeriodTimespan": 30,
"Limit": 2
}
}
對(duì) RateLimitOptions
中幾個(gè)配置項(xiàng)做下解釋:
- ClientWhiteList:一個(gè)字符串?dāng)?shù)組,在請(qǐng)求頭中包含ClientId=xxx的請(qǐng)求不受限流控制掖桦,其中ClientId這個(gè)key可以修改浑此,后邊會(huì)介紹,xxx表示配置的白名單滞详。
- EnableRateLimiting:Boolean值凛俱,是否啟用限流,只有為true時(shí)料饥,配置生效蒲犬。
- Period:限流控制的時(shí)間段,可以輸入 1s(1秒)岸啡,1m(1分)原叮,1h(1小時(shí)),1d(1天)類似的值巡蘸,以此類推奋隶。
- PeriodTimespan:超過限流限制的次數(shù)后,需要等待重置的時(shí)間(單位是秒)悦荒。
- Limit:在Period時(shí)間內(nèi)最大能訪問的數(shù)量唯欣。
用一句話描述一下上邊的配置:對(duì)于除了請(qǐng)求頭中包含ClientId=myclient的請(qǐng)求啟用限流,1分鐘之內(nèi)該api最多被訪問2次搬味,如果已經(jīng)達(dá)到2次境氢,從第2次請(qǐng)求結(jié)束起30秒后才能進(jìn)行下一次訪問。
分別運(yùn)行WebApiB和OcelotGetWay碰纬,使用Postman以get方式請(qǐng)求鏈接http://localhost:5000/webapib/values萍聊,如下所示:
first.png
third.png
再看一下未達(dá)到限制的response header和達(dá)到限制的response header:
first header.png
可以看到在未達(dá)到限制時(shí)的header會(huì)返回前面配置的Perid和剩余請(qǐng)求次數(shù)。
third header.png
在達(dá)到限制時(shí)的header會(huì)返回剩余多長時(shí)間(秒)重置悦析。
再次用Postman以get的方式請(qǐng)求http://localhost:5000/webapib/values寿桨,不過此次要添加header:
multi requests.png
多次請(qǐng)求后同樣可以請(qǐng)求到數(shù)據(jù),并沒有受到限流配置影響强戴。
2亭螟、全局配置
同時(shí)在全局配置中可以添加一些關(guān)于限流的配置來控制是否在response header中返回限流相關(guān)的信息,以及限流的返回信息和狀態(tài)碼還有ClientIdHeader酌泰。
修改 GlobalConfiguration
如下:
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8500
},
"RateLimitOptions": {
"DisableRateLimitHeaders": true,
"QuotaExceededMessage": "Stop request plz!",
"HttpStatusCode": 999,
"ClientIdHeader": "cid"
}
}
重新運(yùn)行Ocelot Api網(wǎng)關(guān)媒佣,請(qǐng)求鏈接如下:
Do not display rate limit headers.png
返回信息中不再包含限流相關(guān)信息。
當(dāng)達(dá)到限流時(shí)陵刹,返回的信息以及狀態(tài)碼也會(huì)根據(jù)配置發(fā)生變化:
status.png
細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)默伍,在上邊的兩次請(qǐng)求中都添加了header ClientId=myclient,但是還是受到了限流控制衰琐,這是因?yàn)槲覀冊(cè)谏线叺娜峙渲弥幸呀?jīng)將ClientId修改為cid也糊,修改header信息重新訪問,就不會(huì)再受到限流控制:
cid.png
源碼下載