首页 > 其他分享 >.NET 高效灵活的API速率限制解决方案

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

时间:2024-06-24 10:12:39浏览次数:21  
标签:Core 解决方案 FireflySoft RateLimit API new NET 限流

前言

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

 

标签:Core,解决方案,FireflySoft,RateLimit,API,new,NET,限流
From: https://www.cnblogs.com/1312mn/p/18264444

相关文章

  • 智能小程序 Ray 开发蓝牙设备API —— 单点蓝牙 API 接口汇总(五)
    postBLEBigDataChannelWithProgress大数据通道操作,支持进度反馈引入import{postBLEBigDataChannelWithProgress}from'@ray-js/ray';需引入DeviceKit,且在>=3.0.0版本才可使用参数Objectobject属性类型默认值必填说明deviceIdstring是deviceId设备idrequestPa......
  • 修复《魔兽世界》更新后api-ms-win-core-com-l1-1-0.dll丢失问题的实战指南
    《魔兽世界》更新后api-ms-win-core-com-l1-1-0.dll丢失的快速修复,通过系统扫描、游戏重装与文件恢复,轻松解决dll缺失难题,重回艾泽拉斯大陆的冒险旅程。如果你在《魔兽世界》更新后遇到“api-ms-win-core-com-l1-1-0.dll”文件丢失的问题,可以尝试以下步骤来解决:1.系统文......
  • 《魔兽世界》游戏emp.dll文件丢失解决方案:快速修复指南
    《魔兽世界》是暴雪娱乐开发的一款大型多人在线角色扮演游戏(MMORPG),玩家在一个广阔而奇幻的世界中冒险,参与联盟与部落的冲突,探索丰富故事线,完成任务,征服怪物,体验深度角色扮演与社交互动。若你在游玩《魔兽世界》时遇到emp.dll文件丢失的问题,可以按照以下步骤尝试修复:1.运行......
  • 面向卫星遥感的红外微小舰船目标检测方法:MTU-Net
    论文简介空间红外微小舰船检测旨在从地球轨道卫星所拍摄的图像中识别并分离出微小舰船。由于图像覆盖面积极其广大(如数千平方公里),这些图像中的候选目标相比空中或地面成像设备观测到的目标,尺寸更小、亮度更低且变化更多。现有的基于短距离成像的红外数据集和目标检测方法难以......
  • 全新发布:AIDOCZH.com 推出 Langchain API参考中文文档,提升查阅API效率!
    全新发布:AIDOCZH.com推出LangchainAPI参考中文文档,提升查阅API效率!一、LangChainAPI中文文档1、从网站中进入http://www.aidoczh.com/langchain/v0.2/docs/introduction/2、直接网页进入http://www.aidoczh.com/langchain_api/html/langchain_api_reference.html......
  • 一款.NET开源的i茅台自动预约小助手
    前言今天大姚给大家分享一款.NET开源、基于WPF实现的i茅台APP接口自动化每日自动预约(抢茅台)小助手:HyggeImaotai。项目介绍该项目通过接口自动化模拟i茅台APP实现每日自动预约茅台酒的功能,软件会在指定时间开始对管理的用户进行批量预约。项目功能用户管理预约项目店铺管......
  • 如何使用ig507金融数据库的股票接口,股票API来获取MACD指标
    一、MACD指标简介MACD(MovingAverageConvergenceDivergence,移动平均收敛/发散)是一种趋势跟踪动量指标,用于分析股票或其他金融产品的价格趋势。MACD由两部分组成:差离值(DIF)和信号线(DEA)。DIF是短期(通常12天)指数移动平均线(EMA)与长期(通常26天)EMA的差值,再通过一个平滑期(通常9天)的EMA......
  • 如何使用ig507金融数据库的股票接口,股票API来获取MACD指标
    一、MACD指标简介MACD(MovingAverageConvergenceDivergence,移动平均收敛/发散)是一种趋势跟踪动量指标,用于分析股票或其他金融产品的价格趋势。MACD由两部分组成:差离值(DIF)和信号线(DEA)。DIF是短期(通常12天)指数移动平均线(EMA)与长期(通常26天)EMA的差值,再通过一个平滑期(通常9天)的E......
  • .Net Core8下Elasticsearch7.x+Nest升级到Elasticsearch8.x+Elastic.Clients.Elastics
    背景Elasticsearch升级到8.11了,对应的客户端插件也跟着升级,以为会兼容Nest的语法,发现自己TooYoungTooSimple!没办法,只能去官网找,结果官网只有最基本的增、删、改、查,只能继续查资料,发现网上资料很少,避免大家少走弯路,这里做个简单的分享。分享1.ElasticsearchClientvaresS......
  • Kubernetes之Service详解
    本文尝试从Service暴露服务方式、Service控制器实现原理、使用规范等方面对Kubernetes中的Service进行详细介绍。一、Kubernetes中的pod有哪些暴露服务的方式各种Kubernetes中暴露服务的方式都有其独特的优缺点,根据具体的使用场景和需求,选择合适的方式非常重要。下面......