.NET 高效靈活的API速率限制解決方案

小码编匠發表於2024-06-24

前言

FireflySoft.RateLimit是基於.NET Core和.NET Standard構建,支援多種速率限制演算法和策略,包括固定視窗、滑動視窗、漏桶、令牌桶等。透過簡單的配置和整合,開發者可以快速地將其應用到現有的Web API、微服務或中介軟體中,實現對請求的精確控制。

同時,該庫還支援分散式系統中的速率限制,透過Redis等分散式快取系統實現資料的共享和同步,確保在不同節點之間實現一致的速率限制效果。

除了強大的功能外,FireflySoft.RateLimit還注重易用性和效能最佳化。提供了簡潔明瞭的API和豐富的示例程式碼,使得開發者能夠快速地掌握其使用方法。同時,我們還對演算法進行了最佳化,減少了不必要的計算開銷,以確保在高併發場景下仍然能夠保持高效的效能表現。

總之,FireflySoft.RateLimit 是一個不錯的限流類庫,其核心簡單輕巧,能夠靈活應對各種需求的限流場景。希望透過它能夠幫助更多的開發者保護系統和API免受惡意請求和過載請求的侵害,同時也期待與大家一起探索更多可能性和創新點。

功能

  • 多種限流演算法:內建固定視窗、滑動視窗、漏桶、令牌桶四種演算法,還可自定義擴充套件。

  • 多種計數儲存:目前支援記憶體、Redis(含叢集)兩種儲存方式。

  • 分散式友好:透過Redis儲存支援分散式程式統一計數。

  • 限流目標靈活:可以從請求中提取各種資料用於設定限流目標。

  • 支援限流懲罰:可以在客戶端觸發限流後鎖定一段時間不允許其訪問。

  • 時間視窗增強:支援到毫秒級別;支援從秒、分鐘、小時、日期等時間週期的起始點開始。

  • 實時限流跟蹤:當前計數週期內已處理的請求數、剩餘允許請求數,以及計數週期重置的時間。

  • 動態更改規則:支援程式執行時動態更改限流規則。

  • 自定義錯誤:可以自定義觸發限流後的錯誤碼和錯誤訊息。

  • 普適性:原則上可以滿足任何需要限流的場景。

專案說明

專案說明
FireflySoft.RateLmit.Core 演算法、規則等限流核心控制程式。
FireflySoft.RateLimit.AspNet ASP.NET 限流處理器,支援 .NET 4.6.1 及以上版本。
FireflySoft.RateLimit.AspNetCore ASP.NET Core 限流中介軟體,支援 .NET Core 2.0 及後續版本。
FireflySoft.RateLimit.Core.UnitTest FireflySoft.RateLimit.Core 的單元測試。
FireflySoft.RateLimit.Core.BenchmarkTest FireflySoft.RateLimit.Core 的基準測試。
Samples/Console 使用 FireflySoft.RateLmit.Core 的控制檯示例程式.
Samples/AspNet 使用 FireflySoft.RateLimit.AspNet 的普通示例程式。
Samples/AspNetCore 使用 FireflySoft.RateLimit.AspNetCore 的普通示例程式。
Samples/RuleAutoUpdate 使用 FireflySoft.RateLimit.AspNetCore 的自動更新限流規則的示例程式。

使用說明

ASP.NET Core 應用

1、安裝 Nuget 包,使用包管理器控制檯:

Install-Package FireflySoft.RateLimit.AspNetCore

或者使用 .NET CLI:

dotnet add package FireflySoft.RateLimit.AspNetCore

或者直接新增到專案檔案中:

<ItemGroup>
<PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="2.*" />
</ItemGroup>

2、使用中介軟體

在Startup.cs中註冊服務並使用中介軟體:

public void ConfigureServices(IServiceCollection services)
{
    ...
​
    services.AddRateLimit(new InProcessFixedWindowAlgorithm(
        new[] {
            new FixedWindowRule()
            {
                ExtractTarget = context =>
                {
                    // 提取限流目標
                    // 這裡是直接從請求中提取Path作為限流目標,還可以多種組合,甚至去遠端查詢一些資料
                    return (context as HttpContext).Request.Path.Value;
                },
                CheckRuleMatching = context =>
                {
                    // 檢查當前請求是否要做限流
                    // 比如有些Url是不做限流的、有些使用者是不做限流的
                    return true;
                },
                Name="default limit rule",
                LimitNumber=30, // 限流時間視窗內的最大允許請求數量
                StatWindow=TimeSpan.FromSeconds(1) // 限流計數的時間視窗
            }
        })
    );
​
    ...
}
​
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
​
    app.UseRateLimit();
​
    ...
}

ASP.NET 應用

1、安裝 Nuget 包,使用包管理器控制檯:

Install-Package FireflySoft.RateLimit.AspNet

2、註冊訊息處理器,開啟 Global.asax.cs,使用下面的程式碼新增限流處理器:

protected void Application_Start()
{
    ...
​
    GlobalConfiguration.Configuration.MessageHandlers.Add(
        new RateLimitHandler(
            new Core.InProcessAlgorithm.InProcessFixedWindowAlgorithm(
                new[] {
                    new FixedWindowRule()
                    {
                        ExtractTarget = context =>
                        {
                            return (context as HttpRequestMessage).RequestUri.AbsolutePath;
                        },
                        CheckRuleMatching = context =>
                        {
                            return true;
                        },
                        Name="default limit rule",
                        LimitNumber=30,
                        StatWindow=TimeSpan.FromSeconds(1)
                    }
                })
        ));
​
    ...
}

其它型別應用

1、安裝 Nuget 包,使用包管理器控制檯

Install-Package FireflySoft.RateLimit.Core

或者 .NET CLI

dotnet add package FireflySoft.RateLimit.Core

2、使用限流演算法,使用 IAlgorithm 過濾每個請求, 處理 Check 方法的返回值。

// 定義限流規則
var fixedWindowRules = new FixedWindowRule[]
{
    new FixedWindowRule()
    {
        Id = "3",
        StatWindow=TimeSpan.FromSeconds(1),
        LimitNumber=30,
        ExtractTarget = (request) =>
        {
            return (request as SimulationRequest).RequestResource;
        },
        CheckRuleMatching = (request) =>
        {
            return true;
        },
    }
};
​
// 使用限流演算法
IAlgorithm algorithm = new InProcessFixedWindowAlgorithm(fixedWindowRules);
​
// 過濾請求
var result = algorithm.Check(new SimulationRequest()
{
    RequestId = Guid.NewGuid().ToString(),
    RequestResource = "home",
    Parameters = new Dictionary<string, string>() {
                { "from","sample" },
        }
});

SimulationRequest是一個自定義請求,你可以把它修改為任何適合自己的請求型別。

地址

https://github.com/bosima/FireflySoft.RateLimit

總結

FireflySoft.RateLimit 是一個功能強大且靈活的速率限制庫,適用於多種應用場景。

透過提供多種演算法和策略、支援分散式系統、易於配置和擴充套件等特點,使得使用者能夠輕鬆地實現API請求的速率控制,保護系統免受惡意請求或過載請求的侵害。

同時,該庫還提供了簡潔明瞭的API和示例程式碼,使得使用者能夠快速上手並整合到現有系統中。

相關文章