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.