• .NET 高效灵活的API速率限制解决方案


    前言

        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和示例代码,使得用户能够快速上手并集成到现有系统中。

     

  • 相关阅读:
    手机银行体验性测试:如何获取用户真实感受
    薪资16K,在华为外包做测试是什么一种什么体验···
    基于STM32F103的HAL库手动配置FreeRTOS
    广告掘金全自动挂机项目,单设备30+【软件脚本+技术教程】
    Docker Desktop启动mysql
    GitHub 项目遭到“有毒”言论攻击,核心开源贡献者被迫出走!
    电脑有机械硬盘和固态硬盘,如何切换系统启动盘?
    JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)
    Linux学习-56-dmesg、free、wc、xargs 命令
    不容错过!什么是领域驱动设计?为什么落地这么难?
  • 原文地址:https://www.cnblogs.com/1312mn/p/18264444