API Gateway en Go: tu director personal de la orquesta de microservicios

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué tu proyecto Go necesita un director

\n\n

Imagina una orquesta sinfónica. Tienes violines (servicio de usuarios), vientos (servicio de pedidos), percusión (servicio de pagos). Cada instrumento es hermoso por sí mismo, pero sin un director tocarán cada uno por su lado. En el mundo de los microservicios en Go, un API Gateway es ese director.

\n\n

Cuando escribes en Go, estás acostumbrado al rendimiento, la simplicidad y la elegancia. Pero tan pronto como la cantidad de servicios supera los 3 o 4, comienza el caos: los clientes no saben a dónde acudir, la autenticación se duplica en cada servicio y el monitoreo se convierte en un dolor de cabeza. Un API Gateway para servicios Go resuelve estos problemas de una vez.

\n\n

En este artículo no solo hablaremos de teoría. Tomaremos Go, la biblioteca estándar y un par de paquetes populares para construir nuestra propia puerta de enlace. ¿Listo para dirigir? ¡Allá vamos!

\n\n

¿Qué es un API Gateway y por qué lo necesitas en Go?

\n\n

Un API Gateway es un punto de entrada único para todas las solicitudes de los clientes a tus servicios backend. Imagina que tienes:

\n\n
    \n
  • user-service:8081 — registro y perfiles
  • \n
  • order-service:8082 — carrito y pedidos
  • \n
  • payment-service:8083 — transacciones
  • \n
\n\n

Sin una puerta de enlace, el cliente debe conocer las direcciones de los tres servicios. Con un API Gateway en Go, solo llama a api.example.com, y la puerta de enlace decide a dónde dirigir la solicitud.

\n\n

Funciones principales de la puerta de enlace

\n\n
    \n
  • Enrutamiento — redirigir solicitudes al servicio correspondiente
  • \n
  • Autenticación y autorización — verificar tokens JWT en un solo lugar
  • \n
  • Limitación de tasa — protección contra DDoS y sobrecargas
  • \n
  • Agregación de datos — combinar respuestas de varios servicios en una
  • \n
  • Balanceo de carga — distribuir solicitudes entre instancias
  • \n
\n\n

Go es ideal para este rol: es ligero, rápido y permite manejar miles de solicitudes por segundo en un solo núcleo.

\n\n

Escribiendo un API Gateway simple en Go: de la idea al código

\n\n

Construyamos una puerta de enlace API en Go mínima pero funcional. Usaremos solo la biblioteca estándar net/http y el paquete httputil.ReverseProxy para el proxy.

\n\n

Paso 1: Enrutamiento básico

\n\n

Empecemos con algo simple: dirigir solicitudes a diferentes servicios según la ruta.

\n\n
package main\n\nimport (\n    "log"\n    "net/http"\n    "net/http/httputil"\n    "net/url"\n)\n\nfunc main() {\n    // Servicio de usuarios\n    userServiceURL, _ := url.Parse("http://localhost:8081")\n    userProxy := httputil.NewSingleHostReverseProxy(userServiceURL)\n\n    // Servicio de pedidos\n    orderServiceURL, _ := url.Parse("http://localhost:8082")\n    orderProxy := httputil.NewSingleHostReverseProxy(orderServiceURL)\n\n    http.HandleFunc("/api/users/", func(w http.ResponseWriter, r *http.Request) {\n        log.Printf("Redirigiendo solicitud a user-service: %s", r.URL.Path)\n        userProxy.ServeHTTP(w, r)\n    })\n\n    http.HandleFunc("/api/orders/", func(w http.ResponseWriter, r *http.Request) {\n        log.Printf("Redirigiendo solicitud a order-service: %s", r.URL.Path)\n        orderProxy.ServeHTTP(w, r)\n    })\n\n    log.Println("API Gateway iniciado en :8080")\n    log.Fatal(http.ListenAndServe(":8080", nil))\n}\n
\n\n

Este código ya hace el 80% del trabajo: cualquier solicitud a /api/users/ va al user-service, y a /api/orders/ al order-service. Pero, ¿dónde está la autenticación?

\n\n

Paso 2: Agregando middleware para JWT

\n\n

La verdadera magia de un API Gateway en Go ocurre en el middleware. Agreguemos una verificación de token JWT antes del proxy.

\n\n
package main\n\nimport (\n    "context"\n    "log"\n    "net/http"\n    "net/http/htt                

Blogs

Book Recommendations