API Gateway
Ponto de entrada único para um conjunto de serviços, centralizando autenticação, roteamento, rate limiting, logging e transformação de requests — ao custo de introduzir um componente crítico que precisa de alta disponibilidade e disciplina para não virar um god object.
Intenção
O API Gateway é o intermediário entre os clientes externos e os serviços internos de um sistema, oferecendo um único endereço de entrada que centraliza preocupações transversais. Em vez de cada serviço implementar autenticação, rate limiting e logging individualmente, o Gateway resolve essas questões uma vez, antes de encaminhar a requisição ao serviço responsável.
O padrão é especialmente valioso em arquiteturas de microsserviços, onde dezenas ou centenas de serviços precisariam de implementação redundante dessas funcionalidades se não houvesse um ponto centralizador. Clientes externos veem apenas um endereço; a complexidade interna fica encapsulada atrás do Gateway.
Problema
Em uma arquitetura de microsserviços, cada serviço é um processo independente com seu próprio endereço de rede. Expor todos eles diretamente aos clientes cria um conjunto de problemas difíceis de resolver individualmente em cada serviço:
- Autenticação duplicada: cada serviço precisaria validar tokens JWT ou chaves de API. Qualquer inconsistência na implementação cria brechas de segurança. Manter a lógica atualizada em vinte serviços é operacionalmente inviável.
-
Acoplamento do cliente à topologia interna: se o
cliente sabe que
/usersestá no host A e/ordersno host B, qualquer reorganização interna quebra os clientes. O cliente não deveria conhecer a topologia interna do sistema. - Rate limiting inconsistente: proteger cada serviço individualmente exige implementação e configuração repetida. Um serviço sem rate limiting é um vetor de abuso ou indisponibilidade por sobrecarga.
- Observabilidade fragmentada: logs distribuídos entre dezenas de serviços sem correlação dificultam o diagnóstico de problemas que atravessam múltiplos serviços.
- Diferentes necessidades de clientes distintos: um app mobile precisa de respostas compactas; um dashboard web precisa de dados agregados; uma integração de terceiros segue um contrato fixo. Cada cliente tem necessidades diferentes do mesmo dado.
Como funciona
Fluxo de requisição
Cliente (browser, app mobile, parceiro)
│
▼
┌─────────────────────────────────────────────┐
│ API Gateway │
│ │
│ 1. Autenticação/Autorização (JWT/API Key) │
│ 2. Rate Limiting │
│ 3. SSL Termination │
│ 4. Roteamento por path/método │
│ 5. Transformação de request/response │
│ 6. Logging e métricas │
└──────────────┬──────────────────────────────┘
│ roteia para o serviço correto
┌────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ User │ │ Order │ │ Payment │
│ Service │ │ Service │ │ Service │
└──────────┘ └──────────┘ └──────────┘
Responsabilidades típicas
-
Roteamento: mapeia paths externos para serviços
internos.
/users/*vai para o User Service;/orders/*vai para o Order Service. Os serviços internos não precisam saber que estão expostos sob esses paths. - Autenticação e Autorização: valida JWT, API Key ou sessão antes de encaminhar a requisição. Os serviços internos confiam que o Gateway já validou a identidade — recebem apenas o contexto do usuário (ex.: user ID em um header interno), sem precisar implementar autenticação.
- Rate Limiting: limita o número de requisições por IP, por usuário autenticado ou por chave de API em uma janela de tempo. Protege os serviços downstream de sobrecarga acidental ou intencional.
- SSL Termination: o Gateway decripta HTTPS e encaminha HTTP simples para os serviços internos. A comunicação interna fica em rede privada, simplificando a gestão de certificados (apenas o Gateway precisa de certificado público).
- Transformação de request e response: pode adicionar headers, converter formatos (ex.: REST externo para gRPC interno), agregar respostas de múltiplos serviços em uma única resposta ao cliente.
- Logging e Observabilidade: ponto central para registrar todas as requisições com correlation ID, facilitando o rastreamento de uma requisição através de múltiplos serviços.
- Circuit Breaker: pode encapsular lógica de resiliência para os serviços downstream — se um serviço está com falhas, o Gateway pode retornar uma resposta de fallback sem propagar a instabilidade ao cliente.
BFF — Backend for Frontend
O padrão BFF é uma variação onde cada tipo de cliente tem seu próprio Gateway especializado com transformações específicas para suas necessidades:
┌─────────────┐ ┌─────────────┐ ┌──────────────────┐
│ App Mobile │ │ Web App │ │ Parceiros (B2B) │
└──────┬──────┘ └──────┬──────┘ └────────┬─────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌──────────────────┐
│ BFF Mobile │ │ BFF Web │ │ BFF B2B │
│ (compacto) │ │ (agregado) │ │ (contrato fixo) │
└──────┬──────┘ └──────┬──────┘ └────────┬─────────┘
└─────────────────┼────────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ User │ │ Order │ │ Payment │
│ Service │ │ Service │ │ Service │
└──────────┘ └──────────┘ └──────────┘
O BFF resolve o problema de clientes com necessidades distintas: o app mobile precisa de payloads menores; o dashboard web precisa de dados agregados de múltiplos serviços em uma chamada; parceiros B2B têm contratos de API fixos e estáveis. Cada BFF adapta o mesmo backend para o cliente que serve, sem que os serviços internos precisem conhecer os diferentes formatos.
API Gateway vs Proxy Reverso
PROXY REVERSO (nginx, HAProxy, Traefik)
─────────────────────────────────────────
Roteia requisições e faz load balancing.
Sem lógica de negócio ou de aplicação.
Configurado por regras estáticas (paths, hosts).
Alta performance, baixa latência de overhead.
API GATEWAY (Kong, AWS API Gateway, Apigee)
─────────────────────────────────────────
Proxy reverso + autenticação + rate limiting
+ transformações + logging centralizado.
Pode ter plugins/middlewares extensíveis.
Overhead maior, mas funcionalidades ricas.
Na prática: um API Gateway usa um proxy reverso
internamente. O que diferencia é a camada de
funcionalidades de aplicação construída em cima.
Quando usar
- Arquitetura de microsserviços com múltiplos serviços expostos: quando há mais de dois ou três serviços que precisam ser acessíveis por clientes externos, o Gateway elimina a duplicação de código de infraestrutura em cada um deles.
- Centralização de autenticação: em vez de cada serviço implementar e manter sua lógica de validação de tokens, o Gateway valida uma vez e propaga apenas o contexto necessário. Uma mudança na estratégia de autenticação (ex.: migração de JWT para PASETO) acontece em um lugar.
- Clientes com necessidades diferentes (BFF): mobile app, SPA web e integrações B2B raramente precisam exatamente do mesmo formato de resposta. O BFF permite adaptar sem contaminar os serviços internos com lógica de apresentação.
- Controle de tráfego e proteção dos serviços: rate limiting, throttling e circuit breaker centralizados no Gateway protegem serviços internos sem exigir que cada um implemente esses mecanismos.
Quando evitar ou ter cuidado
- Monolito ou aplicação simples: adicionar um API Gateway a uma aplicação única é overhead sem benefício — a aplicação já é o ponto de entrada. O padrão existe para resolver a complexidade de múltiplos serviços independentes; sem essa complexidade, ele adiciona latência e um componente extra para operar sem nenhum ganho.
- Gateway como god object com lógica de negócio: o risco mais grave do padrão. Roteamento baseado em estado do usuário, regras de desconto, orquestração de workflows de negócio — tudo isso pertence aos serviços. Um Gateway com lógica de domínio vira um monolito disfarçado que acopla todos os serviços a si mesmo.
Prós e contras
Prós
- Centralização de preocupações transversais: autenticação, rate limiting e logging implementados uma vez, aplicados consistentemente em todos os serviços.
- Desacoplamento da topologia interna: clientes não sabem quais serviços existem internamente — reorganizações internas não quebram os clientes.
- Ponto único de observabilidade: todos os requests passam pelo Gateway, que pode gerar métricas, traces e logs com correlation ID sem depender de cada serviço.
- Simplificação dos serviços internos: cada serviço assume que quem chegou até ele já foi autenticado e autorizado, podendo focar exclusivamente em sua lógica de domínio.
- Controle de versão de API centralizado: múltiplas versões de API podem coexistir no Gateway enquanto os serviços evoluem internamente sem quebrar contratos.
Contras
- Single point of failure: se o Gateway cair, nenhum cliente consegue acessar nenhum serviço. Alta disponibilidade do Gateway não é opcional.
- Latência adicional: cada requisição passa por um hop extra. Em caminhos críticos de latência, esse overhead (tipicamente 1–5 ms) precisa ser considerado.
- Risco de acúmulo de lógica: a conveniência de centralizar incentiva colocar lógica de negócio no Gateway ao longo do tempo, criando um gargalo de deploy e um ponto de acoplamento.
- Complexidade operacional: o Gateway precisa ser operado, monitorado, escalado e atualizado como qualquer outro serviço crítico de infraestrutura.
- Gargalo de escalabilidade: todo o tráfego externo passa pelo Gateway. Escalar o Gateway horizontalmente precisa ser planejado antes que ele se torne o limitador de throughput do sistema.
Armadilhas comuns
1. Lógica de negócio no Gateway
É a armadilha mais comum e mais grave. Começa de forma inocente: uma regra de roteamento que verifica o plano do usuário, um header que muda baseado no saldo da conta, uma transformação que aplica regras de desconto. Com o tempo, o Gateway acumula lógica de domínio que deveria estar nos serviços.
Regra prática: o Gateway deve ser ignorante do domínio. Se a decisão de roteamento depende de algo além da URL, do método HTTP e de headers técnicos (autenticação, content-type), é um sinal de que lógica de negócio está vazando para o Gateway.
2. Single point of failure sem alta disponibilidade
Um Gateway rodando em instância única é um risco existencial para o sistema. Uma falha de hardware, um deploy mal-sucedido ou um pico de tráfego que esgota recursos derruba todos os serviços simultaneamente. O Gateway precisa de múltiplas instâncias atrás de um load balancer, com health checks agressivos e capacidade de auto-scaling.
3. Rate limiting sem granularidade adequada
Limitar requisições apenas por IP penaliza usuários legítimos que compartilham o mesmo endereço IP via NAT corporativo ou CGNAT de provedores móveis — centenas de usuários distintos com o mesmo IP público. O limite baseado em usuário autenticado (por token JWT ou chave de API) é mais preciso e justo. Idealmente, os dois mecanismos coexistem para diferentes tipos de proteção.
# Rate limiting por IP: blunt instrument
# Penaliza grupos de usuários legítimos (NAT, escritório, campus)
# Rate limiting por usuário autenticado: mais preciso
# Limita o comportamento individual, não o IP compartilhado
# Combinação ideal:
# - Por IP: proteção contra bots e ataques não autenticados
# - Por usuário: proteção contra abuso de usuários autenticados
# - Por chave de API: controle de uso para integrações B2B
4. SSL termination sem comunicação interna segura
Terminar TLS no Gateway e usar HTTP simples internamente pressupõe que a rede interna é confiável. Em ambientes cloud multi-tenant, containers orquestrados ou quando compliance exige (PCI-DSS, HIPAA), a rede interna não pode ser assumida como segura. Nesses casos, mTLS (mutual TLS) entre Gateway e serviços garante autenticação mútua e confidencialidade mesmo dentro da rede privada.
Arquiteturas e padrões relacionados
Load Balancing e API Gateway operam em camadas distintas: o load balancer distribui tráfego entre instâncias do mesmo serviço (escala horizontal); o API Gateway roteia entre serviços diferentes. Em produção, o tráfego frequentemente passa pelo Gateway e depois por um load balancer antes de chegar a uma instância específica do serviço.
O Circuit Breaker é um parceiro natural do API Gateway: quando um serviço downstream começa a falhar, o Gateway pode abrir o circuit breaker e retornar uma resposta de fallback sem propagar a instabilidade aos clientes e sem sobrecarregar o serviço doente com requisições que vão falhar de qualquer forma.
A escolha entre REST, GraphQL e gRPC afeta diretamente as responsabilidades do Gateway: uma API GraphQL pode substituir parcialmente o Gateway para consultas compostas (o cliente declara o que precisa em uma única requisição); gRPC interno pode ser exposto como REST externo pelo Gateway via transcoding. O protocolo interno não precisa ser o mesmo que o protocolo externo.
A CDN frequentemente opera na frente do API Gateway: a CDN serve assets estáticos na borda sem chegar ao Gateway; requisições dinâmicas passam pela CDN (que pode ajudar com roteamento geográfico) e chegam ao Gateway para processamento.