ASP.NET Core 的 Web Api 实现限流 中间件

这篇具有很好参考价值的文章主要介绍了ASP.NET Core 的 Web Api 实现限流 中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Microsoft.AspNetCore.RateLimiting 中间件提供速率限制(限流)中间件。

它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下:

RateLimiterOptionsExtensions 类提供下列用于限制速率的扩展方法:​​​​​

  • 固定窗口限制器
  • 滑动窗口限制器
  • 令牌桶限制器
  • 并发限制器

固定窗口限制器

AddFixedWindowLimiter 方法使用固定的时间窗口来限制请求。 当时间窗口过期时,会启动一个新的时间窗口,并重置请求限制。

滑动窗口限制器

滑动窗口算法:

  • 与固定窗口限制器类似,但为每个窗口添加了段。 窗口在每个段间隔滑动一段。 段间隔的计算方式是:(窗口时间)/(每个窗口的段数)。
  • 将窗口的请求数限制为 permitLimit 个请求。
  • 每个时间窗口划分为一个窗口 n 个段。
  • 从倒退一个窗口的过期时间段(当前段之前的 n 个段)获取的请求会添加到当前的段。 我们将倒退一个窗口最近过期时间段称为“过期的段”。

令牌桶限制器

令牌桶限制器与滑动窗口限制器类似,但它不会结存从过期段获取的请求数,而是在每个补充期间添加固定数量的令牌。 每个段添加的令牌数不能使可用令牌数超过令牌桶限制。 下表显示了一个令牌桶限制器,其中令牌数限制为 100 个,补充期为 10 秒。

并发限制器

并发限制器会限制并发请求数。 每添加一个请求,在并发限制中减去 1。 一个请求完成时,在限制中增加 1。 其他请求限制器限制的是指定时间段的请求总数,而与它们不同,并发限制器仅限制并发请求数,不对一段时间内的请求数设置上限。

        以上介绍是参照微软学习文档,相当枯燥无味,简单总结就是以上限制器都是为了限制客户端频繁请求接口,从而导致服务器压力过大的措施,比如可以防止dos攻击。具体实现直接看代码会比较清楚:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
    serverOptions.Listen(IPAddress.Any, 5000);
});

builder.Services.AddRateLimiter(configureOptions =>
{
    //固定窗口限制器
    configureOptions.AddFixedWindowLimiter("fixed", options =>
    {
        //options.QueueLimit = 1;
        options.PermitLimit = 3;
        options.Window = TimeSpan.FromSeconds(10);
        options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    });
    //滑动窗口限制器
    configureOptions.AddSlidingWindowLimiter(policyName: "sliding", options =>
    {
        options.PermitLimit = 3;
        options.Window = TimeSpan.FromSeconds(10);
        options.SegmentsPerWindow = 1;
        options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        //options.QueueLimit = 1;
    });
    //令牌桶限制器
    configureOptions.AddTokenBucketLimiter(policyName: "token", options =>
    {
        options.TokenLimit = 3;
        options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        //options.QueueLimit = 1;
        options.ReplenishmentPeriod = TimeSpan.FromSeconds(10);
        options.TokensPerPeriod = 2;
        options.AutoReplenishment = true;
    });
    //并发
    configureOptions.AddConcurrencyLimiter("ConLimit", options =>
    {
        options.QueueLimit = 10; //达到并发限制进入队列排队的数量,多余会被丢弃
        options.PermitLimit = 200;//并发请求最大数量
        options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;

    });
});

// Add services to the container.
//builder.Services.AddRazorPages();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();                
}
app.UseSwagger();
app.UseSwaggerUI(c => { });

app.UseHttpsRedirection();
//app.UseStaticFiles();
//app.UseRouting();

app.UseAuthorization();

//app.MapRazorPages();
app.MapControllers();

//使用限制器
app.UseRateLimiter();

//固定窗口限制器
static string GetTicks() => DateTime.Now.ToString("HH:mm:ss");
app.MapGet("/fixed", () => Results.Ok($"固定窗口限制器 {GetTicks()}"))
                           .RequireRateLimiting("fixed");
//滑动窗口限制器
app.MapGet("/sliding", () => Results.Ok($"滑动窗口限制器 {GetTicks()}"))
                           .RequireRateLimiting("sliding");
//令牌桶限制器
app.MapGet("/token", () => Results.Ok($"令牌桶限制器 {GetTicks()}"))
                           .RequireRateLimiting("token");
//并发限制器
app.MapGet("/ConLimit", () => Results.Ok($"并发限制器 {GetTicks()}"))
                           .RequireRateLimiting("ConLimit");

app.Run();

核心代码就这些:

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi

运行程序,请求http://localhost:5000/fixed ,如果10s内请求大于3次就失败:

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi

10秒后又可以正常访问:

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi

对指定接口进行限制,只需要在指定接口上使用EnableRateLimiting特性就行:

[EnableRateLimiting("sliding")]
[HttpGet]
public string GetString()
{
    return "111";
}

10秒内请求超3次就失败:

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi

注意上面的 options.QueueLimit 被我注释了,这个主要是设置排队的请求的最大累计允许计数,如果设置了就不会报错而是等待请求,数值是具体可以同时等待的请求数。

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi

ASP.NET Core 的 Web Api 实现限流 中间件,c#,中间件,限速,webapi文章来源地址https://www.toymoban.com/news/detail-798304.html

到了这里,关于ASP.NET Core 的 Web Api 实现限流 中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ASP.NET Core 基础知识】--中间件--创建自定义中间件

    一、为什么需要自定义中间件 自定义中间件在ASP.NET Core中的应用主要有以下几个原因: 满足特定需求: 默认情况下,ASP.NET Core提供了许多内置的中间件来处理常见的任务,如身份验证、授权、静态文件服务等。然而,某些项目可能有特定的需求,需要定制化的处理流程,这

    2024年01月17日
    浏览(54)
  • asp.net core中间件预防防止xss攻击

    上面实现思路是针对json序列化后的string字符串进行编码防止xss攻击 其他实现比如中间件、Action的AOP方法也是可以的,可以自己实现 主要是看web项目使用的是那个json序列化工具newtonsoft就用newtonsoft,system.text.json就用下面的那个

    2024年02月07日
    浏览(47)
  • 如何在 ASP.NET Core 配置请求超时中间件

    本文参考官方文档,使用Asp.net core 8.0 的最小API 模板项目,配置超时中间件。 超时中间件可用于所有类型的ASP.NET Core应用:最小 API、带控制器的 Web API、MVC 和 Razor Pages。请求超时的属性位于命名空间 Microsoft.AspNetCore.Http.Timeouts 中。 需要注意的是,当应用在调试模式下运行时

    2024年01月20日
    浏览(46)
  • 1.ASP.NET Core中间件管道MAP的作用?

    简述: Map基于给定请求路径的匹配项来创建请求管道分支。可以针对不同的路径添加不同的中间件。 详解: 中间件是组装到应用程序管道中以处理请求和响应的软件组件。 每个组件都选择是否将请求传递给管道中的下一个组件,并可以在管道中调用下一个组件之前和之后执

    2024年02月17日
    浏览(39)
  • .net 温故知新【17】:Asp.Net Core WebAPI 中间件

    到这篇文章为止,关于.NET \\\"温故知新\\\"系列的基础知识就完结了,从这一系列的系统回顾和再学习,对于.NET core、ASP.NET CORE又有了一个新的认识。 不光是从使用,还包括这些知识点的原理,虽然深入原理谈不上,但对于日常使用也够了,我想的是知其然,知其所以然。 在实际

    2024年01月18日
    浏览(41)
  • ASP.NET Core如何知道一个请求执行了哪些中间件?

    需要添加两个Nuget包分别是: Microsoft.AspNetCore.MiddlewareAnalysis 和 Microsoft.Extensions.DiagnosticAdapter ,前者是分析记录中间件核心代码实现后者是用来接收日志输出的,由于是用的DiagnosticSource方式记录日志,所以需要使用DiagnosticListener对象的SubscribeWithAdapter方法来订阅。 这个适配器

    2023年04月09日
    浏览(50)
  • asp.net core 一种基于token 和 Permission 的权限管理中间件示例

    asp.net core webapi 下面,想做一个过滤权限的Filter,配合token,对api做一个较为细粒度的权限控制, 该filter (PermissionFilter) 的作用是用户LoginUser.Permissions 列表中有 Key指定的权限才可以访问,没有则返回403 错误码。   1. 先上封装后的使用效果 说明:要求登录即可,不要求特定权限

    2024年02月05日
    浏览(106)
  • 精通中间件测试:Asp.Net Core实战指南,提升应用稳定性和可靠性

    在上一章节我们实战了在 Asp.Net Core 中的项目实战,这一章节讲解一下如何测试 Asp.Net Core 的中间件。 还记得我们在集成测试中提供的 TestServer 吗? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。包含了用于在测试环境中模拟 ASP.NET Core 应用程序的类和方法。通过使用 TestSe

    2024年04月22日
    浏览(39)
  • 后端 .net7 Minimal API 限流中间件(微信小程序无师自通十)

            我的微信小程序使用.net7 Minimal API 作为后端,当服务器摆上公网后,可以观察到很多的攻击行为和暴力访问。所以,我需要使用微软的限流中间件部署相应的功能在服务器上 : AddFixedWindowLimiter using Microsoft.AspNetCore.RateLimiting; using System.Threading.RateLimiting; 后端

    2024年02月12日
    浏览(31)
  • .net core 中间件

    先说一下 管道 这个概念: 在ASP.NET Core中,管道(Pipeline)是一个由多个中间件组成的处理请求和生成响应的机制。请求从第一个中间件开始,经过一系列中间件的处理,然后生成最终的响应。 每个中间件都会处理请求,并将请求传递给下一个中间件,直到达到最后一个中间

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包