API Gateway - Projetando a Entrada de Microsserviços

13 min leitura | 2024.12.30

O que é um API Gateway

Um API Gateway é um componente que funciona como um ponto de entrada único entre clientes e serviços de backend. Ele gerencia centralmente preocupações transversais como autenticação, limitação de taxa e roteamento.

flowchart TB
    Client["Cliente"] --> Gateway["API Gateway<br/>・Autenticação<br/>・Limitação de taxa<br/>・Roteamento<br/>・Logs"]
    Gateway --> SA["Service A"]
    Gateway --> SB["Service B"]
    Gateway --> SC["Service C"]

Principais Funcionalidades

1. Roteamento

Encaminha requisições para os serviços de backend apropriados.

# Exemplo de configuração do Kong
routes:
  - name: user-service
    paths:
      - /api/users
    service: user-service

  - name: order-service
    paths:
      - /api/orders
    service: order-service

2. Autenticação e Autorização

sequenceDiagram
    participant C as Cliente
    participant G as Gateway
    participant Auth as Serviço de Autenticação
    participant B as Serviço de Backend

    C->>G: Requisição
    G->>Auth: Validação do token
    Auth-->>G: Resultado da validação
    G->>B: Encaminhamento da requisição
    B-->>G: Resposta
    G-->>C: Resposta
# Exemplo de configuração de validação JWT
plugins:
  - name: jwt
    config:
      secret_is_base64: true
      claims_to_verify:
        - exp

3. Limitação de Taxa

plugins:
  - name: rate-limiting
    config:
      minute: 100
      policy: local
      fault_tolerant: true

4. Transformação de Requisição/Resposta

// Adição de header de requisição
request.headers['X-Request-ID'] = generateUUID();

// Transformação de resposta
response.body = {
  data: response.body,
  meta: {
    requestId: request.headers['X-Request-ID'],
    timestamp: new Date().toISOString()
  }
};

5. Cache

plugins:
  - name: proxy-cache
    config:
      content_type:
        - application/json
      cache_ttl: 300
      strategy: memory

6. Logging e Monitoramento

plugins:
  - name: http-log
    config:
      http_endpoint: http://logging-service/logs
      method: POST
      content_type: application/json

Padrão BFF (Backend for Frontend)

Prepare API Gateways otimizados para cada tipo de cliente.

flowchart LR
    Web["Web App"] --> BFFWeb["BFF (Web)"]
    Mobile["Mobile App"] --> BFFMobile["BFF (Mobile)"]
    IoT["IoT"] --> BFFIoT["BFF (IoT)"]

    BFFWeb --> SA["Service A"]
    BFFWeb --> SB["Service B"]
    BFFMobile --> SA
    BFFMobile --> SB
    BFFIoT --> SA
    BFFIoT --> SB

Vantagens do BFF

  • Respostas otimizadas para o cliente
  • Oculta a complexidade do backend dos clientes
  • Deploy independente para cada cliente

Principais API Gateways

ProdutoCaracterísticas
KongRico em plugins, extensão Lua
AWS API GatewayServerless, integração com Lambda
EnvoyAlto desempenho, service mesh
NGINX PlusAlto desempenho, ampla experiência
TraefikCloud native, configuração automática
TykOpen source, suporte a GraphQL

Kong vs Envoy

AspectoKongEnvoy
UsoEspecializado em API GatewayInclui service mesh
Método de extensãoPlugins LuaC++/Lua/WASM
ConfiguraçãoAdmin API, declarativoxDS API, yaml
Banco de dadosPostgreSQL/CassandraNenhum (stateless)
Curva de aprendizadoBaixaAlta

API Composition

Agrega dados de múltiplos serviços e retorna.

// Agregação de dados no API Gateway
async function getUserProfile(userId) {
  const [user, orders, reviews] = await Promise.all([
    userService.getUser(userId),
    orderService.getOrders(userId),
    reviewService.getReviews(userId)
  ]);

  return {
    ...user,
    recentOrders: orders.slice(0, 5),
    reviewCount: reviews.length
  };
}

Funcionalidades de Edge

Terminação SSL/TLS

flowchart LR
    Client["Cliente"] -->|HTTPS| Gateway["Gateway<br/>🔐 Gerenciamento de certificados"]
    Gateway -->|HTTP| Internal["Serviços internos"]

Validação de Requisições

plugins:
  - name: request-validator
    config:
      body_schema: |
        {
          "type": "object",
          "required": ["email", "password"],
          "properties": {
            "email": {"type": "string", "format": "email"},
            "password": {"type": "string", "minLength": 8}
          }
        }

Considerações de Design

Não se torne um ponto único de falha

flowchart TB
    LB["Load Balancer"] --> G1["Gateway 1"]
    LB --> G2["Gateway 2"]

Responsabilidades do Gateway

Responsabilidades apropriadas:

  • ✓ Preocupações transversais (autenticação, logs, limitação de taxa)
  • ✓ Conversão de protocolo
  • ✓ Roteamento de requisições

Responsabilidades a evitar:

  • ✗ Lógica de negócios
  • ✗ Transformações de dados complexas
  • ✗ Manutenção de estado

Resumo

O API Gateway é um componente importante na arquitetura de microsserviços que serve como ponte entre clientes e serviços. Ao gerenciar centralmente preocupações transversais como autenticação, limitação de taxa e roteamento, cada serviço pode se concentrar na lógica de negócios. É importante escolher o produto apropriado e projetá-lo para não se tornar um ponto único de falha.

← Voltar para a lista