API Gateway - Disenar la Entrada a los Microservicios

13 min de lectura | 2024.12.30

Que es un API Gateway

Un API Gateway es un componente que funciona como punto de entrada unico entre los clientes y los servicios backend. Gestiona de forma centralizada preocupaciones transversales como autenticacion, limitacion de tasa y enrutamiento.

flowchart TB
    Client["Cliente"] --> Gateway["API Gateway<br/>- Autenticacion<br/>- Limitacion de tasa<br/>- Enrutamiento<br/>- Logs"]
    Gateway --> SA["Service A"]
    Gateway --> SB["Service B"]
    Gateway --> SC["Service C"]

Funciones Principales

1. Enrutamiento

Distribuye las solicitudes a los servicios backend apropiados.

# Ejemplo de configuracion de Kong
routes:
  - name: user-service
    paths:
      - /api/users
    service: user-service

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

2. Autenticacion y Autorizacion

sequenceDiagram
    participant C as Cliente
    participant G as Gateway
    participant Auth as Servicio de Autenticacion
    participant B as Servicio Backend

    C->>G: Solicitud
    G->>Auth: Validar token
    Auth-->>G: Resultado de validacion
    G->>B: Reenviar solicitud
    B-->>G: Respuesta
    G-->>C: Respuesta
# Ejemplo de configuracion de validacion JWT
plugins:
  - name: jwt
    config:
      secret_is_base64: true
      claims_to_verify:
        - exp

3. Limitacion de Tasa

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

4. Transformacion de Solicitud/Respuesta

// Agregar encabezados de solicitud
request.headers['X-Request-ID'] = generateUUID();

// Transformar respuesta
response.body = {
  data: response.body,
  meta: {
    requestId: request.headers['X-Request-ID'],
    timestamp: new Date().toISOString()
  }
};

5. Caching

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

6. Logging y Monitoreo

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

Patron BFF (Backend for Frontend)

Proporciona API Gateways optimizados 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

Ventajas de BFF

  • Respuestas optimizadas para cada cliente
  • Oculta la complejidad del backend a los clientes
  • Despliegue independiente por cliente

Principales API Gateways

ProductoCaracteristicas
KongRico en plugins, extension con Lua
AWS API GatewayServerless, integracion con Lambda
EnvoyAlto rendimiento, service mesh
NGINX PlusAlto rendimiento, amplia trayectoria
TraefikCloud native, configuracion automatica
TykOpen source, soporte GraphQL

Kong vs Envoy

AspectoKongEnvoy
PropositoEspecializado en API GatewayIncluye service mesh
Metodo de extensionPlugins LuaC++/Lua/WASM
ConfiguracionAdmin API, declarativaxDS API, yaml
BDPostgreSQL/CassandraNinguna (stateless)
Curva de aprendizajeBajaAlta

API Composition

Agrega datos de multiples servicios y los devuelve.

// Agregacion de datos en 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
  };
}

Funciones Edge

Terminacion SSL/TLS

flowchart LR
    Client["Cliente"] -->|HTTPS| Gateway["Gateway<br/>Gestion de certificados"]
    Gateway -->|HTTP| Internal["Servicios internos"]

Validacion de Solicitudes

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

Consideraciones de Diseno

Evitar Punto Unico de Fallo

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

Responsabilidades del Gateway

Responsabilidades apropiadas:

  • Preocupaciones transversales (autenticacion, logs, limitacion de tasa)
  • Conversion de protocolos
  • Enrutamiento de solicitudes

Responsabilidades a evitar:

  • Logica de negocio
  • Transformaciones de datos complejas
  • Mantenimiento de estado

Resumen

El API Gateway es un componente importante en la arquitectura de microservicios que actua como puente entre clientes y servicios. Al gestionar de forma centralizada preocupaciones transversales como autenticacion, limitacion de tasa y enrutamiento, cada servicio puede concentrarse en la logica de negocio. Es importante seleccionar el producto adecuado y disenar para evitar que se convierta en un punto unico de fallo.

← Volver a la lista