https://github.com/waelson/rate-limit-with-envoy
Implementação de um mecanismo de Rate Limit usando o Envoy e uso do Prometheus e Grafana para acompanhamento de métricas
https://github.com/waelson/rate-limit-with-envoy
envoy envoyproxy golang grafana prometheus redis statsd
Last synced: about 2 months ago
JSON representation
Implementação de um mecanismo de Rate Limit usando o Envoy e uso do Prometheus e Grafana para acompanhamento de métricas
- Host: GitHub
- URL: https://github.com/waelson/rate-limit-with-envoy
- Owner: Waelson
- License: mit
- Created: 2025-02-18T23:12:13.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-21T09:28:50.000Z (over 1 year ago)
- Last Synced: 2025-03-23T17:45:33.179Z (about 1 year ago)
- Topics: envoy, envoyproxy, golang, grafana, prometheus, redis, statsd
- Language: Shell
- Homepage:
- Size: 3.02 MB
- Stars: 2
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Rate Limit com Envoy Proxy
## Introdução
Essa solução demonstra a utilização de rate limit com Envoy. O rate limit é uma funcionalidade que permite limitar a quantidade de requisições que um serviço pode receber em um determinado período de tempo. O rate limit pode ser aplicado em diferentes níveis, como por exemplo, por serviço, por usuário, por IP, etc.
## Arquitetura

#### Componentes da Arquitetura
| **Componente** | **Descrição** |
|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Envoy Proxy** | Intercepta as requisições antes de encaminhá-las para a aplicação. Verifica se a requisição excede os limites definidos. |
| **Envoy Rate Limit** | Serviço responsável por verificar se uma requisição excede o limite permitido, baseado nos dados armazenados no Redis. Se o limite for excedido, retorna erro `HTTP 429 Too Many Requests`. |
| **Redis** | Banco de dados utilizado para armazenar informações de Rate Limiting, como contadores de requisições por usuário. |
| **StatsD Exporter** | Converte as métricas enviadas pelo Envoy Rate Limit para o formato compatível com Prometheus. |
| **Prometheus** | Coleta as métricas do StatsD Exporter a cada 5 segundos e as armazena para análise e monitoramento. |
| **Grafana** | Visualiza as métricas coletadas pelo Prometheus e apresenta dashboards para acompanhamento do Rate Limiting. |
| **Target Application Cluster** | Conjunto de instâncias da aplicação de destino. Se a requisição estiver dentro do limite, o Envoy Proxy a encaminha para uma dessas instâncias. |
## Configurando e Inicializando a Solução
Siga os passos abaixo para inicializar e configurar a solução de Rate Limit:
### Passo 1: Subir os Contêineres com Docker Compose
Acesse o diretório raiz da solução e execute o seguinte comando para construir e iniciar todos os contêineres:
```bash
$ docker-compose up --build
```
### Passo 2: Testar o Rate Limit
Execute o seguinte comando para testar o Rate Limit:
```bash
chmod +x test_rate_limit.sh
./test_rate_limit.sh
```
O script `test_rate_limit.sh` envia 20000 requisições para o Envoy. As primeiras 20 requisições a cada segundo são permitidas, enquanto o restante são bloqueadas com erro `HTTP 429 Too Many Requests`.

### Passo 3: Criar o dashboard no Grafana
Acesse o Grafana em `http://localhost:3000` e faça login com as credenciais padrão `admin:admin`. Em seguida, busque pelo dashboard `Rate Limit Dashboard` (sim, ele já está configurado). Aguarde alguns instantes e as métricas serão exibidas.

## Ajustando o Rate Limit
### Rate Limit Global
Para ajustar o Rate Limit, edite o arquivo `projects/config/ratelimite/config.yaml` e altere os valores de `unit` e `requests_per_unit` conforme necessário. Por exemplo, para limitar a 500 requisições por minuto, utilize o seguinte trecho de código:
```yaml
- key: path
value: /
rate_limit:
unit: second
requests_per_unit: 20
```
### Rate Limit por API Key
Para limitar o Rate Limit por API Key, edite o arquivo `projects/config/ratelimite/config.yaml` e descomente o trecho de código abaixo.:
```yaml
...
- key: "x-api-key"
descriptors:
- key: path
value: /
rate_limit:
unit: minute
requests_per_unit: 400
...
```
Agora, no arquivo `projects/config/envoy/proxy.yaml` descomente o trecho de código abaixo e depois reinicie o docker-compose:
```yaml
...
route:
cluster: application
rate_limits:
- actions:
- request_headers:
header_name: "x-api-key"
descriptor_key: "x-api-key"
...
```
## FAQ
### O que é Envoy?
Envoy é um proxy de borda de alto desempenho e código aberto, projetado para aplicações modernas de microsserviços. Ele foi projetado para ser distribuído, resiliente, inteligente e altamente configurável.
### O que é Rate Limit?
Rate Limit é uma funcionalidade que permite limitar a quantidade de requisições que um serviço pode receber em um determinado período de tempo. O rate limit pode ser aplicado em diferentes níveis, como por exemplo, por serviço, por usuário, por IP, etc.
### Por que usar Rate Limit?
O Rate Limit é uma técnica importante para proteger serviços de abusos e ataques de negação de serviço (DDoS). Ele também pode ser utilizado para garantir a qualidade de serviço (QoS) e evitar que um único usuário ou serviço monopolize os recursos disponíveis.
### Como o Rate Limit funciona?
O Rate Limit funciona verificando se uma requisição excede o limite permitido. Se o limite for excedido, o Rate Limit retorna um erro `HTTP 429 Too Many Requests`. Caso contrário, a requisição é encaminhada para o serviço de destino.
### Como o Rate Limit é implementado?
O Rate Limit é implementado utilizando um proxy como Envoy. O Envoy intercepta as requisições antes de encaminhá-las para a aplicação. Ele verifica se a requisição excede os limites definidos e, se necessário, bloqueia a requisição.