前言
在上一篇介紹了 ASP.NET Core 中的限流框架 AspNetCoreRateLimit,紀錄使用者 Request 的 IP 作為限定流量的判斷來源,並將計數器的值存放在 Server 的 Memory 中,存放在 Memory 中如果 Server 數量單台的話會沒有問題,如果 Server 數量不只一台就需要共用的 Cache Server 來存放 Request 資訊,此時可以搭配 Redis 作為 Cache server 使用,讓所有 Server 在判斷限流時都具備相同的限制條件,這篇就紀錄 AspNetCoreRateLimit 整合 Redis 的操作與設定,若有問題或是錯誤的地方歡迎網路的高手大大給予指導。
安裝 Redis
首先,起手式先來安裝 Redis,想使用 Redis 可以參考之前的介紹文章
Window : 在 Windows 下載與安裝 Redis、使用 Docker 安裝 Redis
Linux : 在 CentOS7 上安裝 Redis
這裡直接使用 Docker 指令來起 Redis 服務,在 powershell 輸入下列指令
設定 AspNetCoreRateLimit
在前一篇完整的介紹 AspNetCoreRateLimit 設定方式與代碼,這裡僅說明差異的地方,要使用 Redis Cache 可以使用 IDistributedCache ,IDistributedCache 在 ASP.NET Core 中命名空間為 Microsoft.Extensions.Caching.Redis,因此下一步是進行安裝的動作,在 Nuget Console 輸入下列指令
確認 Redis 資料
此時,在重新執行應用程式可以發現當達到設定的次數上限時,就會跳出我們熟悉阻擋的訊息
AspNetCoreRateLimit 將資料儲存在 Redis 成功,大功告成 !!!
在上一篇介紹了 ASP.NET Core 中的限流框架 AspNetCoreRateLimit,紀錄使用者 Request 的 IP 作為限定流量的判斷來源,並將計數器的值存放在 Server 的 Memory 中,存放在 Memory 中如果 Server 數量單台的話會沒有問題,如果 Server 數量不只一台就需要共用的 Cache Server 來存放 Request 資訊,此時可以搭配 Redis 作為 Cache server 使用,讓所有 Server 在判斷限流時都具備相同的限制條件,這篇就紀錄 AspNetCoreRateLimit 整合 Redis 的操作與設定,若有問題或是錯誤的地方歡迎網路的高手大大給予指導。
首先,起手式先來安裝 Redis,想使用 Redis 可以參考之前的介紹文章
> docker run --name redis-throttle -p 6379:6379 -d redis啟動成功會顯示 docker 的 container ID 資訊在畫面上,接著在輸入 docker ps -a 確認
> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 23e010857e85 redis "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 0.0.0.0:6379->6379/tcp redis-throttleRedis 啟動成功,對應的 Port 號為 6379
在前一篇完整的介紹 AspNetCoreRateLimit 設定方式與代碼,這裡僅說明差異的地方,要使用 Redis Cache 可以使用 IDistributedCache ,IDistributedCache 在 ASP.NET Core 中命名空間為 Microsoft.Extensions.Caching.Redis,因此下一步是進行安裝的動作,在 Nuget Console 輸入下列指令
Install-Package Microsoft.Extensions.Caching.Redis -Version 2.2.0接著到 startup.cs 將原本儲存在 memory 的地方,改成存到 Redis 並且定義 Redis 的連線字串內容
public void ConfigureServices(IServiceCollection services) { // 省略 // 注入 counter and IP Rules //services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); //services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>(); services.AddSingleton<IRateLimitCounterStore, DistributedCacheRateLimitCounterStore>(); services.AddDistributedRedisCache(option => { option.Configuration = Configuration["Redis:ConnectionString"]; option.InstanceName = Configuration["Redis:InstanceName"]; }); }代碼中定義了 Redis Server 的連線字串與名稱,Throttle 的 Rule 設定為 10m 僅能訪問 1次,因此我們需要到 appsettuing.json 加上 Redis 的設定資料
"Redis": { "ConnectionString": "127.0.0.1:6379", "InstanceName": "Redis Throttle" },
確認 Redis 資料
此時,在重新執行應用程式可以發現當達到設定的次數上限時,就會跳出我們熟悉阻擋的訊息
API calls quota exceeded! maximum admitted 1 per 10m.再來使用 Redis Desktop Manager 連線到 Docker 內的 Redis,可以發現當達到上限次數時 Redis 有存放相關的 Request 資料,如下圖所示
AspNetCoreRateLimit 將資料儲存在 Redis 成功,大功告成 !!!