关注【索引目录】服务号,更多精彩内容等你来探索!
介绍
速率限制是构建高弹性、安全且可扩展的后端应用程序的关键机制。在 http://ASP.NET Core 中,借助诸如 等强大的库,实现有效的速率限制非常简单AspNetCoreRateLimit。本文将引导您了解速率限制的概念、其重要性以及如何在 ASP.NET Core 项目中实现它。
动图
什么是速率限制?为什么它很重要?
速率限制是一种控制网络接口、API 或应用程序传入流量的策略。它限制用户或 IP 地址在特定时间段内可以发出的请求数量。
为什么它很重要?
- 安全性:
防止各种恶意攻击,例如拒绝服务 (DoS)、分布式拒绝服务 (DDoS) 和登录端点的暴力攻击。 - 稳定性和性能:
通过确保单个客户端或客户端组不会因过多请求而导致系统不堪重负,从而防止服务器资源耗尽。这将为所有用户带来更佳的应用程序稳定性和性能。 - 公平使用:
确保所有客户端都能公平地访问共享资源,防止少数“吵闹的邻居”降低其他客户端的服务质量。 - 成本管理:
对于依赖于第三方 API 或按请求或数据传输收费的云资源的服务,速率限制可以通过防止过度使用来帮助控制成本。
速率限制解决的问题:
- API 滥用:
防止脚本或不良行为者抓取数据或向您的 API 发送垃圾邮件。 - 流量高峰:
帮助管理流量的突然激增,确保应用程序保持响应。 - 资源匮乏:
避免少数重度用户消耗所有可用服务器资源(CPU、内存、带宽)的情况。
速率限制的实际场景
- 登录端点:
限制登录尝试以防止暴力攻击。 - 公共 API:
控制请求数量以确保公平使用并保护后端服务。 - 资源密集型操作:
限制触发计算密集型任务的端点请求。 - 第三方 API 集成:
如果您的应用程序充当网关或代理,请限制对下游服务的请求速率,以保持在它们的使用配额范围内。 - 数据导出/导入功能:
防止用户过于频繁地导出或导入大量数据。
在 http://ASP.NET Core [.NET 9] 中实现速率限制AspNetCoreRateLimit
AspNetCoreRateLimit是一个流行且灵活的 NuGet 包,为 ASP.NET Core 应用程序提供基于 IP 和客户端 ID 的速率限制中间件。
让我们来看看实施步骤。
先决条件
-
.NET SDK(本指南主要针对 .NET 6 及更高版本,但旧版本的概念类似)。 -
一个 http://ASP.NET Core Web API 项目。
步骤 1:安装 NuGet 包
打开终端或程序包管理器控制台,然后在项目目录中运行以下 .NET CLI 命令:
dotnet add package AspNetCoreRateLimit
此命令将必要的包添加到您的项目中。
步骤 2:在您的中添加必要的 DI 和中间件program.cs:
//for .NET version 9
var builder = WebApplication.CreateBuilder(args);
//Rate limiter
builder.Services.AddMemoryCache();
builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("IpRateLimiting")); // Ensure this section exists in appsettings.json or is configured
builder.Services.Configure<IpRateLimitPolicies>(builder.Configuration.GetSection("IpRateLimitPolicies")); // Ensure this section exists in appsettings.json or is configured
builder.Services.AddInMemoryRateLimiting();
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); // Add this line
builder.Services.Configure<IpRateLimitOptions>(options =>
{
options.EnableEndpointRateLimiting = true;
options.StackBlockedRequests = false; // Do not stack blocked requests
options.HttpStatusCode = 429; // Use HTTP 429 Too Many Requests status code
options.RealIpHeader = "X-Real-IP"; // Use this header to get the real IP address
options.ClientIdHeader = "X-ClientId"; // Use this header to identify clients
options.GeneralRules =
[
new RateLimitRule
{
Endpoint = "*", //rate limit effective for all API endpoints
Period = "10s",
Limit = 2 // 2 requests per 10 seconds
}
];
});
稍后,在配置好服务后,您可以按如下方式构建应用程序:
var app = builder.Build();
app.UseIpRateLimiting(); // Enable rate limiting middleware
app.Run();
步骤 3:打开你的 Swagger 并测试速率限制器:
您可以打开您的 swagger 并测试您的速率限制器,并且您应该能够429在超出速率限制配额后获取错误代码(我将其设置为每 10 秒 2 个请求)。
结论
实现速率限制是构建健壮、安全且公平的 http://ASP.NET Core 应用程序的基础步骤。该AspNetCoreRateLimit软件包为大多数常见的速率限制场景提供了灵活且易于使用的解决方案。
通过有效配置速率限制,您可以保护您的应用程序免受滥用,确保高负载下的稳定性,并为所有用户提供更好的体验。
进一步探索:
- 客户端特定限制:
探索在需要通过 API 密钥或类似令牌识别客户端的场景 ClientRateLimiting中使用。ClientIdHeader - 基于用户角色的限制:
为了实现更精细的控制,您可能需要实现自定义逻辑,可能通过创建自定义速率限制策略或与 http://ASP.NET Core 的授权系统集成来实现。 - 分布式计数器:
对于跨多个实例部署(横向扩展)的应用程序,默认 MemoryCache存储不足以满足需求,因为它们位于每个实例的本地。支持 Redis 或 SQL Server 等分布式存储。您可以将和 以及已配置的分布式缓存(例如 )一起AspNetCoreRateLimit使用。DistributedCacheIpPolicyStoreDistributedCacheRateLimitCounterStoreservices.AddStackExchangeRedisCache(...) - 自定义限制行为:
深入了解库的选项以获得更高级的配置,例如白名单 IP、不同的阻止策略或自定义重试消息。
关注【索引目录】服务号,更多精彩内容等你来探索!

