.Net Core 使用 AspNetCoreRateLimit 实现限流

上一篇文章介绍过ASP.NET Core 的 Web Api 实现限流 中间件-CSDN博客

使用.NET 7 自带的中间件 Microsoft.AspNetCore.RateLimiting 可以实现简单的Api限流,但是这个.NET 7以后才集成的中间件,如果你使用的是早期版本的.NET,可以使用第三方库AspNetCoreRateLimit实现Api限流。

AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在根据 IP 地址或客户端 ID 控制客户端可以向 Web API 或 MVC 应用发出的请求速率。AspNetCoreRateLimit 包包含一个客户端IP限流中间件(IpRateLimitMiddleware)和一个客户端ID限流中间件(ClientRateLimitMiddleware),例如允许 IP 或客户端在时间间隔内(如每秒、15 分钟等)进行最大调用次数。您可以定义这些限制以处理对 API 发出的所有请求,也可以将限制范围限定为每个 API URL 或 HTTP 谓词和路径。

具体实现如下:

1.安装包 AspNetCoreRateLimit :

Install-Package AspNetCoreRateLimit

2.appsettings.json文件配置

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","RateLimiting": {//false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制//true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,"EnableEndpointRateLimiting": false,//false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等),则必须设置StackBlockedRequests为true。"StackBlockedRequests": false,//Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置"RealIpHeader": "X-Real-IP",//取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。"ClientIdHeader": "X-ClientId",//限制状态码"HttpStatusCode": 429,IP白名单:支持Ip v4和v6 //"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],端点白名单:支持各种请求;//"EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],客户端白名单//"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],//通用规则"GeneralRules": [{//端点路径"Endpoint": "*",//时间段,格式:{数字}{单位};可使用单位:s, m, h, d"Period": "1s",//限制"Limit": 1},//15分钟只能调用100次{"Endpoint": "*","Period": "15m","Limit": 100},//12H只能调用1000{"Endpoint": "*","Period": "12h","Limit": 1000},//7天只能调用10000次{"Endpoint": "*","Period": "7d","Limit": 10000}]},"IpRateLimitPolicies": {//ip规则"IpRules": [{//IP"Ip": "127.0.0.1",//规则内容"Rules": [//1s请求10次{"Endpoint": "*","Period": "1s","Limit": 10},//15分钟请求200次{"Endpoint": "*","Period": "15m","Limit": 200}]},{//ip支持设置多个"Ip": "192.168.3.22/25","Rules": [//1秒请求5次{"Endpoint": "*","Period": "1s","Limit": 5},//15分钟请求150次{"Endpoint": "*","Period": "15m","Limit": 150},//12小时请求500次{"Endpoint": "*","Period": "12h","Limit": 500}]}]},"ClientRateLimitPolicies": {"ClientRules": [{"ClientId": "client-id-1","Rules": [{"Endpoint": "*","Period": "1s","Limit": 10},{"Endpoint": "*","Period": "15m","Limit": 200}]},{"ClientId": "client-id-2","Rules": [{"Endpoint": "*","Period": "1s","Limit": 5},{"Endpoint": "*","Period": "15m","Limit": 150},{"Endpoint": "*","Period": "12h","Limit": 500}]}]}
}

3.服务的注入与使用

在 Program.cs 添加注入服务的代码:

public static void Main(string[] args)
{var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();#region 注入限流//需要从appsettings.json加载配置builder.Services.AddOptions();//需要存储速率限制计数器和ip规则builder.Services.AddMemoryCache();//从appsettings.json加载常规配置builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("RateLimiting"));//从appsettings.json加载ip规则builder.Services.Configure<IpRateLimitPolicies>(builder.Configuration.GetSection("IpRateLimitPolicies"));//builder.Services.Configure<ClientRateLimitOptions>(builder.Configuration.GetSection("RateLimiting"));//builder.Services.Configure<ClientRateLimitPolicies>(builder.Configuration.GetSection("ClientRateLimitPolicies"));// 注入计数器和规则存储builder.Services.AddInMemoryRateLimiting();//services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>();//services.AddDistributedRateLimiting<RedisProcessingStrategy>();//services.AddRedisRateLimiting();builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();#endregionvar app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}app.UseAuthorization();//启用客户端IP限制速率app.UseIpRateLimiting();//启用客户端ID限制速率//app.UseClientRateLimiting();app.MapControllers();app.Run();
}

4.运行测试

我这里配置的是默认1秒只能请求一次,超出一次返回429 

API calls quota exceeded! maximum admitted 1 per 1s.

错误:

5.基于客户端ID速率限制

如果要启用客户端ID速率限制,需要使用 ClientRateLimitMiddleware 中间件 ,Program.cs中使用app.UseClientRateLimiting();来启用客户端ID限制速率,配置加载也要使用ClientRateLimitOptions和ClientRateLimitPolicies:

在 appsettings.json 增加 ClientRateLimitPolicies配置:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412156.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10个用于Android开发的有用的Kotlin库及示例

10个用于Android开发的有用的Kotlin库及示例 在Android开发领域&#xff0c;Kotlin已成为一门领先的语言&#xff0c;带来了现代语法和功能的浪潮。随着Kotlin的崛起&#xff0c;涌现出了许多专为其定制的库&#xff0c;进一步增强了开发体验。本文将深入介绍其中的10个库&…

C#中的文件操作

为什么要对文件进行操作&#xff1f; 在计算机当中&#xff0c;数据是二进制的形式存在的&#xff0c;文件则是用于存储这些数据的单位&#xff0c;因此在需要操作计算机中的数据时&#xff0c;需要对文件进行操作。 在程序开发过程中&#xff0c;操作变量和常量的时候&#…

Dockerfile镜像实战

目录 一 构建SSH镜像 1.开启ip转发功能 2. 准备工作目录 3.修改配置文件 5.启动容器并修改root密码 二 构建Systemctl镜像 1. 准备工作目录 ​编辑2.修改配置文件 3.生成镜像 4.启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;进行初始化 5.进入容器 三…

Elasticsearch各种高级文档操作2

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作

MyBatisPlus学习笔记四-扩展功能

1、代码生成器 1.1、官方的1 1.3、官方的2-idea插件 1.3、非官方的-idea插件 2、静态工具 先查询&#xff0c;再分组 3、逻辑删除 4、枚举处理器 5、JSON处理器

Docker之安装Nginx

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。&#x1f3af;&…

力扣(144. 二叉树的前序遍历94.二叉树的中序遍历145. 二叉树的后序遍历)

题目链接 题目1&#xff1a; 思路&#xff1a;较简单的思路&#xff0c;就是先将左孩子全部入栈&#xff0c;然后出栈访问右孩子&#xff0c;右孩子为空&#xff0c;再出栈&#xff0c;不为空&#xff0c;右孩子入栈&#xff0c;然后再次循环访问左孩子。 /*** Definition fo…

Android NDK Crash信息收集捕获和日志异常定位分析(addr2line)

Android NDK 闪退日志收集与分析 我们在开发过程中,Android JNI层Crash问题或者我们引用的第三方.so库文件报错,都是一个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同Java的Exception Strace堆栈信息,所以定位问题也是个比较艰难的事情。 Google Br…

STM32+ MAX30102通过指尖测量心率+血氧饱和度

一、前言 重要的事情放在最前面&#xff1a;max30102只适用于指尖手指测量&#xff0c;不适用与手腕手指测量&#xff0c;如需做成可穿戴样式选择传感器的小伙伴请pass掉他&#xff0c;因为他只有红光和红外2种光&#xff0c;不够充足的数据源去运算。 由于一些原因&#xff0c…

关于“等待”的交互设计

01 背景 等待是人一生不可避免的事情&#xff1a;购票排队时的等待&#xff0c;飞机延误时的等待&#xff0c;就餐时的等待…等待往往和无聊、厌烦的情绪联系在一起&#xff0c;因为人们在等待中不仅浪费了大量时间&#xff0c;同时还要承受心理上的煎熬&#xff0c;时间越长心…

mac vscode latex实用

网上有教程怎么在vscode里安装macTex以及插件&#xff0c;然后就可以在latex里写代码了&#xff0c;这里需要修改的是对应的json文件&#xff0c;输入command P,可以看到最近打开的json设置文件&#xff0c;结果如下 然后设置这个json文件&#xff0c;我的json文件设置如下 …

4. Mybatis 事务和Spring事务关系

大体上分为两种情况&#xff1a;方法上添加了事务注解Transactional 和方法上没有添加事务注解Transactional。 添加了Transactional 注解的在注入 bean 的时候就会被创建代理类&#xff0c;在代理类中使用增强逻辑进行事务处理。没有添加Transactional 注解的&#xff0c;在 …