在当今这个信息爆炸的时代,Web API的服务质量愈加受到开发者和企业的重视,其中之一就是如何合理地限制客户端的访问频率,以保证服务的稳定和公平。今天我们将深入探讨一个优秀的.Net Core速率限制组件——AspNetCoreRateLimit。
AspNetCoreRateLimit 是一个为ASP.NET Core设计的轻量级且高效的速率限制库。它的核心功能是帮助你控制客户端对Web API或MVC应用程序的请求频率,这种频率的控制可以基于IP地址或客户端ID进行。源代码完全开放,你可以在GitHub上找到
https://github.com/stefanprodan/AspNetCoreRateLimit
并使用这个库,你可以轻松地为不同的需求场景设置多元化的限制规则。
如何安装
首先,在NuGet包管理器中搜索AspNetCoreRateLimit
并进行安装。NuGet是.Net平台的包管理器,它允许开发者分享和使用他人编写的代码。
如何配置
安装完成之后,下一步就是配置限流的规则。你需要打开appsettings.json
配置文件,并添加相应的配置节点。以IpRateLimiting
为例,主要的配置项如下:
"IpRateLimiting": {
//true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,
//false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制
"EnableEndpointRateLimiting": true,
//false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等)
//,则必须设置StackBlockedRequests为true。
"StackBlockedRequests": false,
//Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
"RealIpHeader": "X-Real-IP",
//取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
"ClientIdHeader": "X-ClientId",
IP白名单:支持Ip v4和v6
"IpWhitelist": null,
"EndpointWhitelist": null,
"HttpStatusCode": 429,
"QuotaExceededResponse": {
"Content": "{{ \"message\": \"Too many requests,Please try again in {2} second(s).\", \"code\": 429,\"data \":\"\"}}",
"ContentType": "application/json"
},
//规则
"GeneralRules": [
{
"Endpoint": "*/api/FeeOpen/GetCropTransDetails",
"Period": "1s",
"Limit": 1
}
]
}
这里的"EnableEndpointRateLimiting"为true
时,表示每个API接口都拥有独立的限流计数,如果为false
则表示所有接口共享计数。其他配置选项则定义了当请求超限时返回的HTTP状态码和自定义响应内容。
依赖注入
为了在ASP.NET Core项目中使用AspNetCoreRateLimit
,我们需要在Startup.cs
文件中的ConfigureServices
方法中进行依赖注入:
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
同时,在Configure
方法中添加中间件:
app.UseIpRateLimiting();
配置接口限流规则
在appsettings.json
中的GeneralRules
部分,你可以定义具体的接口限流规则。例如,你可以设置某个API接口在1秒内只允许访问1次:
"GeneralRules": [
{
"Endpoint": "*/api/Xzy/GetMyName",
"Period": "1s",
"Limit": 1
}
]
你也可以设置全局限流规则,对所有接口生效:
"GeneralRules": [
{
"Endpoint": "*",
"Period": "1s",
"Limit": 1
}
]
此外,支持根据不同的时间间隔设置不同的限流规则,例如:
"GeneralRules": [
{
"Endpoint": "*",
"Period": "1s",
"Limit": 2
},
{
"Endpoint": "*",
"Period": "15m",
"Limit": 100
},
{
"Endpoint": "*",
"Period": "12h",
"Limit": 1000
},
{
"Endpoint": "*",
"Period": "7d",
"Limit": 10000
}
]
根据以上设置,当客户端请求的频率超过限制规则时,系统会返回429 Too Many Requests
状态码。
当然,这个状态码和响应描述也是可以在QuotaExceededResponse中自定义的
通过这样的方式,AspNetCoreRateLimit使得API的流量控制具备了高度的灵活性和可配置性。这不仅可以防止恶意用户滥用资源,还能够在用户高峰期间平滑流量,保障服务质量,从而为最终用户带来更加稳定和可靠的服务体验。
结语
在API的开发和维护过程中,合理地设置请求限流策略对于保证系统稳定性和优化用户体验至关重要。AspNetCoreRateLimit作为一个成熟的中间件,提供了一套简便的配置和强大的功能,助力开发者和企业高效实现API的流量控制。