在上一篇介紹了 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 成功,大功告成 !!!
0 意見:
張貼留言