Rate Limiting Avançado: Proteja sua API com .NET 8+

Imagine sua API🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. sendo bombardeada por milhares de requests por segundo. Servidores superaquecendo, usuários legítimos bloqueados e prejuízos escalando. Rate Limiting Avançado é o guardião que previne esse caos! Em .NET 8+, você tem ferramentas profissionais para criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. barreiras inteligentes contra abusos. Vamos explorar estratégias além do básico, usando o poder do AspNetCore.RateLimiting.

📌 Conteúdo🔗

🔍 O que é Rate Limiting?🔗

O Rate Limiting é uma técnica utilizada para controlar a quantidade de requisições que um cliente pode fazer à sua API num determinado período. Essa disciplina não só protege os recursos do servidor, mas também garante uma experiência🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! de usuário mais estável, evitando que ações maliciosas ou mesmo erros de implementação degradem o serviço.

🚨 Por que usar Rate Limiting?🔗

Imagine que você tem uma API que calcula o preço de fretes. Se alguém começar a fazer milhares de requisições por segundo, seu servidor pode ficar sobrecarregado, e outros usuários legítimos não conseguirão usar o serviçoCriando e Escalando Serviços no Docker SwarmCriando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster.. Sem Rate Limiting, você está basicamente dando carta branca para abusos.

Além disso, Rate Limiting ajuda a:

🛠️ Tipos de Políticas de Rate Limiting🔗

No ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real., você pode implementar diferentes tipos de políticas de Rate Limiting:

1. Limite Fixo: Um número fixo de requisições por período de tempo (ex: 100 requisições por minuto).

2. Janela Deslizante (Sliding Window): O limite é recalculado continuamente com base em uma janela de tempo deslizante.

3. Token Bucket: Um balde de tokens é preenchido em uma taxa fixa, e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. cada requisição consome um token.

4. Concurrency: Limita o número de requisições simultâneas.

⚖️ Algoritmos de Controle: Escolha sua Arma!🔗

AlgoritmoCenário IdealCódigo .NET 8
Sliding WindowAPIs com picos temporaisAddSlidingWindowLimiter
Token BucketStreaming de dados constanteAddTokenBucketLimiter
ConcurrencyLimitar conexões simultâneasAddConcurrencyLimiter
CustomizadoRegras específicas de negócioImplemente IRateLimiterPolicy

Sliding Window em Ação:

builder.Services.AddRateLimiter(options =>
{
    options.AddSlidingWindowLimiter("api", limiter =>
    {
        limiter.Window = TimeSpan.FromSeconds(30);
        limiter.PermitLimit = 50;
        limiter.SegmentsPerWindow = 6; // Divide a janela em 6 partes de 5s
        limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    });
});

🛠️ Implementação Prática em .NET 8🔗

Passo 1: Instale o pacote

dotnet add package Microsoft.AspNetCore.RateLimiting

Passo 2: Configure no Program.cs

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRateLimiter(options =>
{
    // Global
    options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
        RateLimitPartition.GetFixedWindowLimiter(
            partitionKey: context.Request.Headers.Host.ToString(),
            factory: partition => new FixedWindowRateLimiterOptions
            {
                AutoReplenishment = true,
                PermitLimit = 1000,
                Window = TimeSpan.FromMinutes(1)
            }));
    // Endpoint específico
    options.AddPolicy("sensivel", context =>
        RateLimitPartition.GetSlidingWindowLimiter(
            partitionKey: context.User.Identity?.Name ?? context.Request.Headers["X-Client-ID"]!,
            factory: _ => new SlidingWindowRateLimiterOptions
            {
                PermitLimit = 20,
                Window = TimeSpan.FromMinutes(1),
                SegmentsPerWindow = 4
            }));
});
var app = builder.Build();
app.UseRateLimiter();

Passo 3: Aplique aos endpoints📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos.

app.MapGet("/api/pagamentos", () => "OK")
   .RequireRateLimiting("sensivel");

🎨 Customização de Políticas🔗

Crie regras complexas:

public class GeoRateLimiterPolicy : IRateLimiterPolicy<string>
{
    public RateLimitPartition<string> GetPartition(HttpContext context)
    {
        var country = context.Request.Headers["CF-IPCountry"];
        var limit = country switch
        {
            "BR" => 500,
            "US" => 1000,
            _ => 100
        };
        return RateLimitPartition.GetFixedWindowLimiter(
            country.ToString(),
            _ => new()
            {
                Window = TimeSpan.FromHours(1),
                PermitLimit = limit
            });
    }
}
// Registro:
options.AddPolicy<string, GeoRateLimiterPolicy>("geo-limit");
  • Limites personalizados por região geográfica usando headers do Cloudflare.

📊 Monitoramento e Logs🔗

Integre com Application InsightsAsync Profiler e Telemetria com Application InsightsAsync Profiler e Telemetria com Application InsightsDescubra como otimizar aplicações assíncronas utilizando Async Profiler e Application Insights para identificar gargalos e melhorar a performance.:

app.UseRateLimiter();
app.Use(async (context, next) =>
{
    var limiter = context.RequestServices.GetRequiredService<IRateLimiter>();
    var metrics = limiter.GetMetrics();
    var telemetry = context.RequestServices.GetRequiredService<TelemetryClient>();
    telemetry.TrackMetric("RateLimit.RemainingPermits", metrics.CurrentPermits);
    await next();
});

Dados-chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. para monitorar:

  • CurrentPermits: Permissões restantes
  • TotalFailedLeases: Requests bloqueados
  • TotalSuccessfulLeases: Requests permitidos

🧪 Desafio Prático🔗

Objetivo: Implemente um sistema de rate limiting que:

1. Permita 100 requests/min para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! usuários anônimos

2. 500 requests/min para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! usuários autenticados

3. 2000 requests/min para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! clientes com header "X-Partner-Key"

4. Bloqueie totalmente IPs que excedam 3x o limite em 1h

Dicas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados.:

// Combine políticas
options.AddPolicy("camadas", context =>
{
    if (context.Request.Headers.ContainsKey("X-Partner-Key"))
        return RateLimitPartition.GetNoLimiter("partner");
    if (context.User.Identity.IsAuthenticated)
        return RateLimitPartition.GetSlidingWindowLimiter(context.User.Identity.Name!, ...);
    return RateLimitPartition.GetFixedWindowLimiter(context.Connection.RemoteIpAddress?.ToString()!, ...);
});

Próximo nível: Armazene os contadores em Redis para escalabilidade horizontal🚀 Scale Out com Redis: Atenda Milhões de Conexões!🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real.!

builder.Services.AddStackExchangeRedisCache(...);
builder.Services.AddSingleton<IRateLimiterPolicy, DistributedRateLimiter>();

🏁 Práticas Recomendadas e Considerações Finais🔗

No cenário atual, proteger suas APIs com rate limiting é uma prática indispensável para manter a estabilidade e a segurança do seu sistema. Ao implementar técnicas avançadas, você estará preparado para enfrentar desde tráfego intenso até possíveis ataques maliciosos, garantindo sempre uma experiência🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! de serviço de qualidade.

Esperamos que este artigo tenha esclarecido os conceitos e as técnicas necessárias para você aprimorar a proteção das suas APIs. Agora, é hora de colocar a mão na massa e adaptar essas ideias ao seu ambiente ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.! 🚀

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo