Rate limiter de alta performance desenvolvido em Go, com armazenamento em Redis, suporte a limitação por IP e por Token de acesso, e bloqueio configurável por janela de tempo.
ratelimiter/
├── cmd/
│ └── server/
│ └── main.go # Entrypoint da aplicação
├── configs/
│ └── config.go # Carregamento de variáveis de ambiente
├── infra/
│ └── database/
│ ├── interface.go # Contrato da camada de persistência
│ └── redis_store.go # Implementação com Redis
├── internal/
│ ├── limiter/
│ │ └── ratelimiter.go # Lógica central do rate limiting
│ └── middleware/
│ └── ratelimiter_middleware.go # Middleware HTTP
└── test/
└── ratelimiter_test.go # Testes de integração
| Camada | Tecnologia |
|---|---|
| Linguagem | Go 1.21+ |
| Armazenamento | Redis |
| Containerização | Docker + Docker Compose |
- Limitação por IP — controla requisições por endereço IP do cliente
- Limitação por Token — tokens de acesso têm limites independentes e prioritários
- Bloqueio configurável — tempo de bloqueio definido via variável de ambiente
- Persistência em Redis — estado compartilhado, pronto para ambientes distribuídos
- Middleware HTTP plugável — integração transparente com qualquer handler Go
Quando uma requisição possui um token de acesso no header, o limiter usa a regra do token e ignora o limite por IP. Isso permite políticas diferenciadas por cliente sem complexidade adicional:
Requisição com Token → aplica RATE_LIMIT_TOKEN
Requisição sem Token → aplica RATE_LIMIT_IP
Por que Redis?
- Estado compartilhado entre múltiplas instâncias da aplicação
- Operações atômicas via comandos nativos (
INCR,EXPIRE) - TTL nativo — bloqueio expira automaticamente sem job de limpeza
git clone https://github.com/deduardolima/ratelimiter.git
cd ratelimiterCrie um arquivo .env na raiz do projeto:
REDIS_ADDR=localhost:6379
RATE_LIMIT_IP=5 # máximo de requisições/segundo por IP
RATE_LIMIT_TOKEN=10 # máximo de requisições/segundo por Token
BLOCK_TIME=300 # tempo de bloqueio em segundosdocker-compose up --build| Serviço | URL |
|---|---|
| API | http://localhost:8080 |
| Redis | localhost:6379 |
curl http://localhost:8080/curl http://localhost:8080/ -H "API_KEY: meu-token-aqui"HTTP 429 Too Many Requests
you have reached the maximum number of requests or actions allowed within a certain time frame
docker-compose run testSobe um container isolado e executa a suíte de testes da aplicação.
- Implementação de rate limiting do zero, sem biblioteca externa
- Uso de Redis como store distribuído com TTL nativo
- Separação entre lógica de negócio (
limiter/) e infraestrutura (infra/) - Interface de repositório desacoplada — fácil trocar Redis por outro store
- Middleware HTTP reutilizável e configurável via environment