O Rate Limiter é um middleware que limita o número de requisições que um cliente (por IP ou API_KEY) pode fazer em um determinado período de tempo. Ele é útil para proteger APIs contra abusos, como ataques de negação de serviço (DoS) ou uso excessivo de recursos.
O Rate Limiter funciona com base em duas estratégias principais:
-
Limite por IP:
- Restringe o número de requisições que um endereço IP pode fazer por segundo.
- Se o limite for excedido, o IP é bloqueado temporariamente.
-
Limite por API_KEY:
- Restringe o número de requisições que um token (API_KEY) pode fazer por segundo.
- Se o limite for excedido, o token é bloqueado temporariamente.
- Quando um cliente (IP ou API_KEY) excede o limite de requisições, ele é bloqueado por um tempo configurável (
BLOCK_TIME
). - Após o tempo de bloqueio expirar, o cliente pode fazer novas requisições.
O Rate Limiter é configurado por meio de um arquivo .env
e variáveis de ambiente. Abaixo estão as configurações disponíveis:
Crie um arquivo .env
dentro da pasta cmd do projeto com as seguintes variáveis:
REDIS_ADDR="redis:6379" # Endereço do Redis
LIMIT_PER_IP=true # Habilita o limite por IP (true/false)
LIMIT_PER_API_KEY=false # Habilita o limite por API_KEY (true/false)
MAX_REQUESTS_PER_SECOND=10 # Número máximo de requisições por segundo, deve ser um valor inteiro
BLOCK_TIME=2 # Tempo de bloqueio em segundos, deve ser um valor inteiro
HTTP_CODE_LIMIT_REACHED=429 # Código HTTP retornado quando o limite é excedido
MESSAGE_LIMIT_REACHED="Too many requests" # Mensagem retornada quando o limite é excedido
REDIS_ADDR
: Endereço do Redis (usado para armazenar contadores e bloqueios).LIMIT_PER_IP
: Habilita ou desabilita o limite por IP.LIMIT_PER_API_KEY
: Habilita ou desabilita o limite por API_KEY.MAX_REQUESTS_PER_SECOND
: Número máximo de requisições permitidas por segundo.BLOCK_TIME
: Tempo (em segundos) que um cliente fica bloqueado após exceder o limite.HTTP_CODE_LIMIT_REACHED
: Código HTTP retornado quando o limite é excedido (padrão: 429 - Too Many Requests).MESSAGE_LIMIT_REACHED
: Mensagem retornada quando o limite é excedido.
- Docker e Docker Compose instalados.
- Arquivo
.env
configurado (veja a seção de configuração acima).
- Clone o Respositório
git clone https://github.com/Ruteski/rate-limiter.git
cd rate-limiter
- Construa e Suba os Contêineres: Execute o seguinte comando para construir a imagem da aplicação e subir os contêineres (Redis e aplicação):
docker-compose up --build -d
- Verifique os Contêineres Verifique se os contêineres estão rodando:
docker ps
Você deve ver dois contêineres:
redis_rate_limiter
: Contêiner do Redis.rate_limiter_app
: Contêiner da aplicação.
- Teste a Aplicação Use o comando curl para testar a aplicação:
for i in {1..12}; do curl -H "api_key:qwe-987" -i localhost:8080; done
- As primeiras 10 requisições serão permitidas (configurado em
MAX_REQUESTS_PER_SECOND
). - As requisições excedentes retornarão o código HTTP
429
e a mensagem"Too many requests"
(configurado emMESSAGE_LIMIT_REACHED
)
- Verifique os Logs Para ver os logs da aplicação, use:
docker logs rate_limiter_app
- Pare os Contêineres: Para parar os contêineres, use:
docker-compose down
A estrutura do projeto é a seguinte:
/projeto
/cmd
main.go # Ponto de entrada da aplicação
.env # Arquivo de configuração
/config
config.go # Código para carregar as configurações
/limiter
limiter.go # Lógica do Rate Limiter
/middleware
middleware.go # Middleware para integrar o Rate Limiter
/store
in-memory.go # Implementação do armazenamento em memória
redis.go # Implementação do armazenamento no Redis
store.go # Interface do armazenamento
/tests
rate_limiter_test.go # Testes automatizados
docker-compose.yaml # Configuração do Docker Compose
Dockerfile # Dockerfile para construir a imagem da aplicação
go.mod # Dependências do projeto
go.sum # Checksum das dependências
O projeto inclui testes automatizados para garantir que o Rate Limiter funcione corretamente. Para rodar os testes, execute na raiz do projeto:
go test -v ./tests
- Os testes cobrem cenários como:
- Limite de requisições por IP.
- Limite de requisições por API_KEY.
- Bloqueio temporário após exceder o limite.
- Liberação após o tempo de bloqueio expirar.
- Faça um fork do repositório.
- Crie uma branch para sua feature ou correção:
git checkout -b minha-feature
- Envie suas alterações:
git commit -m "Adiciona nova feature"
git push origin minha-feature
- Abra um pull request no repositório original.
O Rate Limiter é uma solução eficiente para proteger APIs contra abusos e garantir o uso justo dos recursos. Com configurações flexíveis e suporte a Redis ou armazenamento em memória, ele pode ser adaptado para diferentes cenários de uso.
Para mais informações, consulte o código-fonte ou entre em contato com os mantenedores do projeto. 🚀