Настройка промежуточного ПО ограничения частоты запросов
Применяйте ограничения частоты запросов к конечным точкам и политикам.
«Настройка промежуточного ПО ограничения частоты запросов» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
AddRateLimiter
Конфигурация начинается с AddRateLimiter в контейнере служб. Вы задаёте одну или несколько именованных политик и необязательный глобальный код состояния при отклонении.
builder.Services.AddRateLimiter(options =>
{
options.RejectionStatusCode =
StatusCodes.Status429TooManyRequests;
});Политика фиксированного окна
AddFixedWindowLimiter регистрирует именованную политику. Задайте лимит разрешённых запросов, длительность окна и поведение очереди.
options.AddFixedWindowLimiter("fixed", limiter =>
{
limiter.PermitLimit = 100;
limiter.Window = TimeSpan.FromMinutes(1);
limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
limiter.QueueLimit = 0;
});Политика скользящего окна
AddSlidingWindowLimiter добавляет SegmentsPerWindow для управления степенью сглаживания.
options.AddSlidingWindowLimiter("sliding", limiter =>
{
limiter.PermitLimit = 100;
limiter.Window = TimeSpan.FromMinutes(1);
limiter.SegmentsPerWindow = 6;
limiter.QueueLimit = 0;
});Политика корзины токенов
AddTokenBucketLimiter задаёт размер корзины и скорость её пополнения.
options.AddTokenBucketLimiter("token", limiter =>
{
limiter.TokenLimit = 100;
limiter.TokensPerPeriod = 20;
limiter.ReplenishmentPeriod = TimeSpan.FromSeconds(10);
limiter.QueueLimit = 0;
});Политика параллелизма
AddConcurrencyLimiter ограничивает число одновременных запросов.
options.AddConcurrencyLimiter("concurrent", limiter =>
{
limiter.PermitLimit = 5;
limiter.QueueLimit = 10;
limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
});Добавление промежуточного ПО
Включите ограничение частоты запросов в конвейере с помощью UseRateLimiter. Разместите его в начале, после маршрутизации.
var app = builder.Build();
app.UseRateLimiter();
app.MapControllers();RequireRateLimiting
Примените именованную политику к конечным точкам с помощью RequireRateLimiting (минимальный API) или атрибута [EnableRateLimiting] (контроллеры).
app.MapGet("/search", () => Results.Ok())
.RequireRateLimiting("token");
// Controller equivalent:
// [EnableRateLimiting("token")]Отключение для отдельных конечных точек
Исключите конечную точку из действия группового или глобального ограничителя с помощью DisableRateLimiting или [DisableRateLimiting].
app.MapGet("/health", () => Results.Ok())
.DisableRateLimiting();Глобальный ограничитель с разделами
GlobalLimiter применяется к каждому запросу. Используйте PartitionedRateLimiter.Create, чтобы у каждого пользователя или IP был собственный счётчик.
options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(
context =>
{
var key = context.User.Identity?.Name
?? context.Connection.RemoteIpAddress?.ToString()
?? "anon";
return RateLimitPartition.GetFixedWindowLimiter(key, _ =>
new FixedWindowRateLimiterOptions
{
PermitLimit = 100,
Window = TimeSpan.FromMinutes(1)
});
});Настройка отклонения запросов
OnRejected позволяет добавить заголовок Retry-After или понятное пользователю содержимое ответа, когда запрос отклонён из-за ограничения частоты.
options.OnRejected = async (context, token) =>
{
if (context.Lease.TryGetMetadata(
MetadataName.RetryAfter, out var retry))
context.HttpContext.Response.Headers.RetryAfter =
((int)retry.TotalSeconds).ToString();
await context.HttpContext.Response
.WriteAsync("Rate limit exceeded.", token);
};Применение к группе маршрутов
Примените политику ко всей группе маршрутов, чтобы все конечные точки внутри неё использовали общий лимит.
var api = app.MapGroup("/api")
.RequireRateLimiting("fixed");
api.MapGet("/products", () => Results.Ok());
api.MapGet("/orders", () => Results.Ok());Быстрая проверка
Проверьте настройку промежуточного ПО.
Итоги
Вы настроили ограничение частоты запросов:
AddRateLimiterопределяет политики фиксированного окна, скользящего окна, корзины токенов и параллелизма.UseRateLimiterвключает промежуточное ПО, аRequireRateLimitingприменяет политику.GlobalLimiterвместе сPartitionedRateLimiterсоздаёт отдельные счётчики для клиентов.OnRejectedнастраивает ответ 429.
Далее: кэширование результатов.
Часто задаваемые вопросы
Урок «Настройка промежуточного ПО ограничения частоты запросов» бесплатный?
Да — полный текст урока «Настройка промежуточного ПО ограничения частоты запросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Настройка промежуточного ПО ограничения частоты запросов»?
Применяйте ограничения частоты запросов к конечным точкам и политикам. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Настройка промежуточного ПО ограничения частоты запросов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Алгоритмы ограничения частоты запросов
- Настройка промежуточного ПО ограничения частоты запросов
- Основы кэширования результатов
- Политики кэша и его аннулирование