.Netcore 2.0 Ocelot Api網(wǎng)關(guān)教程(7)- 限流

本文介紹Ocelot中的限流,限流允許Api網(wǎng)關(guān)控制一段時(shí)間內(nèi)特定api的總訪問次數(shù)。
限流的使用非常簡單,只需要添加配置即可。

1、添加限流

修改 configuration.json 配置文件,對 UpstreamPathTemplate/webapib/values 的配置修改如下:

{
    // ...
    "UpstreamPathTemplate": "/webapib/values",
    "UpstreamHttpMethod": [ "Get" ],
    "RateLimitOptions": {
      "ClientWhiteList": [
        "myclient"
      ],
      "EnableRateLimiting": true,
      "Period": "1m",
      "PeriodTimespan": 30,
      "Limit": 2
    }
}

RateLimitOptions 中幾個(gè)配置項(xiàng)做下解釋:

  • ClientWhiteList:一個(gè)字符串?dāng)?shù)組,在請求頭中包含ClientId=xxx的請求不受限流控制,其中ClientId這個(gè)key可以修改,后邊會介紹,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ù)量。
    用一句話描述一下上邊的配置:對于除了請求頭中包含ClientId=myclient的請求啟用限流,1分鐘之內(nèi)該api最多被訪問2次,如果已經(jīng)達(dá)到2次,從第2次請求結(jié)束起30秒后才能進(jìn)行下一次訪問。
    分別運(yùn)行WebApiB和OcelotGetWay,使用Postman以get方式請求鏈接http://localhost:5000/webapib/values,如下所示:
    first.png

    third.png

    再看一下未達(dá)到限制的response header和達(dá)到限制的response header:
    first header.png

    可以看到在未達(dá)到限制時(shí)的header會返回前面配置的Perid和剩余請求次數(shù)。
    third header.png

    在達(dá)到限制時(shí)的header會返回剩余多長時(shí)間(秒)重置。
    再次用Postman以get的方式請求http://localhost:5000/webapib/values,不過此次要添加header:
    multi requests.png

    多次請求后同樣可以請求到數(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),請求鏈接如下:

Do not display rate limit headers.png

返回信息中不再包含限流相關(guān)信息。
當(dāng)達(dá)到限流時(shí),返回的信息以及狀態(tài)碼也會根據(jù)配置發(fā)生變化:
status.png

細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn),在上邊的兩次請求中都添加了header ClientId=myclient,但是還是受到了限流控制,這是因?yàn)槲覀冊谏线叺娜峙渲弥幸呀?jīng)將ClientId修改為cid,修改header信息重新訪問,就不會再受到限流控制:
cid.png

源碼下載

完,下一篇介紹緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容