No desenvolvimento de APIs algumas vezes é necessário controlar a taxa de trafego que é recebido pela rede para previnir ataques como DoS ou limitar o número de requests que um único usuário/origem pode fazer para um dado recurso.

Numa arquitetura de microservices o API Gateway é o ponto de entrada para toda aplicação e aplicar regras para limitar o número de acessos nessa camada se encaixa perfeitamente.

Spring Cloud Netflix Zuul

Spring Cloud Netflix Zuul é um API Gateway Open Source que encapsula Netflix Zuul e adiciona várias funcionalidades, infelizmente rate limiting não é algo presente por padrão.

Adicionando Rate Limit no Zuul

Para corrigir esse problema é possível usar essa biblioteca OSS junto com Spring Cloud Netflix Zuul no qual irá adicionar suporte para fazer rate-limiting dos requests.

Limitadores Suportados

A implementação atual suporta uma lista de configurações por serviço assim como uma configuração padrão para todos os outros serviços caso seja necessário.

Rate Limit Type Descrição
Usuário autenticado Usa o username do usuário autenticado ou ‘anonymous’
Origem do request Usa o IP de origem do usuário
URL Usa o caminho do request para o downstream service
Configuração global por serviço Esse não valida origem do request, autenticação ou URI. Para usar essa abordagem basta não setar nenhum tipo

Armazenamentos Suportados

Implementação

Todas as implementações de rate-limiting são feitas usando Zuul Filters e aplicando validações baseadas nas configurações por serviço, no caso de não existir uma configuração os filtros não são acionados.

Quando um limite é alcançado o API Gateway retorna o status code 429 Too Many Requests para o cliente.

Configuração

Tudo o que foi descrito acima pode ser configurado usando arquivo properties ou YAML e não há necessidade de adicionar nenhum código para fazer funcionar.

Mais Detalhes

Para mais detalhes na implementação e uso, por favor visite o repositório do projeto.