只有累積,沒有奇蹟

2022年5月23日 星期一

[NETCore] ASP.NET Core 限流框架 AspNetCoreRateLimit 整合 Redis

前言
在上一篇介紹了 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 輸入下列指令
    > 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-throttle
    
    Redis 啟動成功,對應的 Port 號為 6379

    設定 AspNetCoreRateLimit  
    在前一篇完整的介紹 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 意見:

    張貼留言

    Copyright © m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com