1.限流(Rate Limiting)
很多時候為了防止DoS攻擊,我們會通過限流方式對上游請求進行限制,以保護下游服務不會負荷過載,為客戶端提供高質量的資源服務,在Ocelot限流專案示例中,通過APIGateway專案路由RateLimitOptions選項可以配置限流,專案對示例APIServices專案Get方法進行限流,檔案配置具體代碼如下:
{ "Routes": [ { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], "UpstreamPathTemplate": "/customers", "UpstreamHttpMethod": [ "Get" ], "RateLimitOptions": { //客戶端白名單,名單中的客戶端不會被限流, "ClientWhitelist": [], //是否啟用限流, "EnableRateLimiting": true, //限流時間(1s,5m,1h,1d),在限流時間內限制請求數,需要等PeriodTimespan時間過去了,才能再次發起請求, "Period": "1s", //限流時間間隔,限流后多少秒后才可以再次發起請求, "PeriodTimespan": 3, //限制請求數, "Limit": 1 } } ], //全域配置,所有下游服務都執行如下限流配置 "GlobalConfiguration": { "RequestIdKey": "OcRequestId", "AdministrationPath": "/administration", "RateLimitOptions": { //是否禁用X-Rate-Limit和Retry-After標頭, "DisableRateLimitHeaders": false, //限流回傳的訊息, "QuotaExceededMessage": "Customize Tips!" } } }
下面來介紹下RateLimitOptions選項幾個引數:
●ClientWhitelist:客戶端白名單,名單中的客戶端不會被限流,
●EnableRateLimiting:是否啟用限流,
●Period:限流時間(1s,5m,1h,1d),在限流時間內限制請求數,需要等PeriodTimespan時間過去了,才能再次發起請求,
●PeriodTimespan:限流時間間隔,限流后多少秒后才可以再次發起請求,
●Limit:限制請求數,
●DisableRateLimitHeaders:是否禁用X-Rate-Limit和Retry-After標頭,
●QuotaExceededMessage:限流回傳的訊息,
●HttpStatusCode:限流時候,指定回傳的HTTP狀態代碼,
●ClientIdHeader:允許您指定應用于標識客戶端的標頭,默認情況下為“ClientId”,
2.專案演示
2.1APIGateway專案
添加Ocelot服務注入和Logging資訊輸出:
public class Startup { public Startup(IWebHostEnvironment env) { var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder(); builder.SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json") //add configuration.json .AddJsonFile("configuration.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; } public void ConfigureServices(IServiceCollection services) { //輸出Logging資訊; services.AddLogging(logging => { logging.AddConsole(); logging.AddDebug(); }); //添加Ocelot服務; services.AddOcelot(Configuration); } public void Configure(IApplicationBuilder app) { //使用Ocelot; app.UseOcelot().Wait(); } }
2.2APIServices專案
專案添加一個Get方法作對比,對應APIGateway專案的路由上下游配置,具體代碼如下:
[Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } }
2.3專案運行
輸入dotnet run --project 專案路徑\專案檔案.csproj把兩個專案啟動起來,通過在瀏覽器不斷重繪上游服務地址,會看到如下資訊:

根據上述資訊可以知道在1秒時間內,如果請求數超過路由配置限制數,那么Ocelot網關就會直接回傳429狀態碼和全域給客戶端,不會再轉發到對應下游服務方法去,防止了惡意攻擊,保證了下游服務不會負荷過載!
參考文獻:
Ocelot官網
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/223868.html
標籤:.NET技术
上一篇:部署Dotnet Core應用到Kubernetes(二)
下一篇:如何將自定義屬性添加到用戶物體
