掌握API建模:基本概念和实践
.NET 7.0在.NET Core Web API中实现限流就这么简单
限流可以保障web API站点的安全性,它有助于保护服务器的资源,防止无效的访问,从而达到站点访问平衡性。本文将探讨如何在.NET Core Web API实现限流。并用案例介绍如何限流。
1、什么是限流
限流是一种用于限制客户端在特定时间段内可以请求API次数。它为客户端访问某些接口或资源的访问频率设置了限流。通过实施限流,开发人员可以防止滥用访问、服务器负载均衡并保持高质量的用户体验。
2、限流的策略
1)基于令牌桶:令牌桶算法使用虚拟令牌桶来跟踪每个客户端的请求。客户端每次发出请求时,它都会消耗一个令牌。如果令牌桶为空,则客户端将被阻止发出更多请求,直到令牌桶重新填充。2)基于漏桶:漏桶算法使用虚拟漏桶来跟踪每个客户端的请求。客户端每次发出请求时,它都会将请求添加到漏桶中。漏桶以恒定的速率漏出请求。如果漏桶已满,则客户端将被阻止发出更多请求,直到漏桶中的请求被处理完。3)基于滑动窗口:滑动窗口算法跟踪每个客户端在特定时间段(例如,一分钟)内发出的请求数。如果客户端在时间段内发出的请求数超过限制,则它将被阻止请求,直到当前时间段结束。
本文将介绍如何在.NET Core Web API实现基于滑动窗口的限流。
3、.NET Core Web API实现限流.
NET Core Web API有许多实现限流的方法,可以自定义中间件,也可以使用第三方的中间件等。本文将介绍使用“AspNetCoreRateLimit”中间件实现API的限流。“AspNetCoreRateLimit”中间件是nuget开源项目,目前有2.9kstars,还算不错。它是“基于滑动窗口”实现限流,它的主要规则是可以根据客户端的ip来限制指定时间段的访问次数。使用步骤:
1)安装nuget包
用vs新建一个Web API项目,使用nuget程序包管理控制台命令或者NuGet 包管理器安装AspNetCoreRateLimit中间件。命令安装如下。
Install-package AspNetCoreRateLimit
2)在 Program.cs开始文件中注册AspNetCoreRateLimit组件,代码如下:
builder.Services.AddMemoryCache();
//下面的IpRateLimiting为限流策略的配置文件结点名称,可以配置多个策略
builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("IpRateLimiting"));
//添加对内存中的 IP 策略存储的支持
builder.Services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
builder.Services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
builder.Services.AddInMemoryRateLimiting();
3) 在 appsettings.json文件中添加规则,规则如下:
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"IpWhitelist": [],
"EndpointWhitelist": [],
"GeneralRules": [
{
"Endpoint": "GET:/WeatherForecast",
"Period": "1m",
"Limit": 10
}
]
}
//欢迎关注公众号DOTNET开发跳槽,领取面试题
//加微信号xbhpnet入群交流技术和跳槽经验.
上面的节点名称是配置中间件时节点名称,规则GeneralRules的节点下,意思是限制/WeatherForecast的链接,每分钟最大请求次数为10次。如果达到限制次数,将对客户端返回429。具体规则可以看官网。
4)添加中间件
为了达到效果,最好添加到第一个,代码如下:
var app = builder.Build();
app.UseIpRateLimiting();
5)效果如下
最后我们来看看效果,是否能真限流。
视频中展示了限流的效果,1分钟内限流10次,超过次数后会拦截访问并给出提示。
上面展示了.NET Core Web API限流的步骤和效果,还可以设置多种限流的方式,比如全局限流等,大家可以查阅这个中间件的文档,文档如下:github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#defining-rate-limit-rules
结语
本文讲述了在.NET Core Web API中实现限流,以及限流的方式和概念。限流尽管有很多优点,但是对于某些项目,缺点也是显而易见的,限流增加了开发和维护的复杂程度、某些情况下会降低用户的体验度、由于需要检查访问次数,可能会影响API站点的性能等。希望本文对你有所收获,欢迎留言讨论或者吐槽本文。同时欢迎关注“dotnet开发跳槽”公众号的其它文章。
本文章转载微信公众号@CSharp编程大全