簡介 .net core使用ocelot 第一篇 簡單使用 .net core使用ocelot 第二篇 身份驗證 .net core使用ocelot 第三篇 日誌記錄 前幾篇文章我們陸續介紹如何用ASP.NET Core 創建API網關。 這次我們討論Ocelot的流量限制模塊。 什麼是流量控制(R ...
簡介
前幾篇文章我們陸續介紹如何用ASP.NET Core 創建API網關。
這次我們討論Ocelot的流量限制模塊。
什麼是流量控制(Rate Limiting)高端詞 限流熔斷
維基百科定義流量控制是網路介面控制器限制發送接收的流量以防止DoS攻擊。
多數APIs每秒(每份,或者其他短時間周期)被調用的次數是被限制的,以便保護服務以免過載或者為多數客戶端提供高質量的服務。
現在我們看看Ocelot是如何實現速度限制的。
這裡我用Ocelot 3.1.5創建一個示例。
準備
我們創建兩個項目並保證能運行。
和往常一樣,先創建兩個項目。
項目名稱 |
項目類型 |
描述 |
APIGateway |
ASP.NET Core Empty |
示例的入口 |
APIServices |
ASP.NET Core Web API |
API服務提供一些服務 |
給APIGateway項目添加基本configuration.json文件
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], "UpstreamPathTemplate": "/customers", "UpstreamHttpMethod": [ "Get" ] }, { "DownstreamPathTemplate": "/api/values/{id}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], "UpstreamPathTemplate": "/customers/{id}", "UpstreamHttpMethod": [ "Get" ] } ], "GlobalConfiguration": { "RequestIdKey": "OcRequestId", "AdministrationPath": "/administration" } }
註意
需要註意節點DownstreamHostAndPorts,之前的Ocelot版本,該節點被DownstreamHost和DownstreamPort替代。
啟動這兩個項目,你會看到下麵的結果。
我們的準備工作完成了,接下來我們對http://localhost:9000/customers配置流量限制。
在configuration.json添加流量限制
我們只需要添加RateLimitOptions節點。如下的配置。
{ "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], "UpstreamPathTemplate": "/customers", "UpstreamHttpMethod": [ "Get" ], "RateLimitOptions": { "ClientWhitelist": [], "EnableRateLimiting": true, "Period": "1s", "PeriodTimespan": 1, "Limit": 1 } } //others.....
好了。啟動項目看看流量限制效果。
我們可以看見,API請求超出配額,1秒只允許請求1次。當我們的請求在1秒中超過一次。你可以看到下圖的情況。
返回狀態碼為429(請求太多),在返回頭(Response Header)包含Retry-After屬性,這個屬性意味我們1秒後再嘗試請求。
更多配置
在上面我們已經實現了速度限制。
可能你會有下麵的疑問。
- 我們可以替換預設的提示嗎?(超過限制返回的提示)
- 我們能移除返回頭的流量限制標記嗎?
- 我們能修改超限的返回狀態碼嗎?
當然可以。
只需要添加一些全局配置即可。
"GlobalConfiguration": { "RequestIdKey": "OcRequestId", "AdministrationPath": "/administration", "RateLimitOptions": { "DisableRateLimitHeaders": false, "QuotaExceededMessage": "Customize Tips!", "HttpStatusCode": 999 } }
我們具體介紹一下GlobalConfiguration的RateLimitOptions節點。
- DisableRateLimitHeaders:是否顯示X-Rate-Limit和Retry-After頭
- QuotaExceededMessage:超限提示信息
- HttpStatusCode:當流量限制後返回的狀態碼
添加上面的配置以後,我們看下圖的效果。
源碼在此
網盤鏈接:https://pan.baidu.com/s/17sqfGcYx8yEHRL_LwKAUlA
提取碼:p3d0
總結
Null