Introducción: por qué tu proyecto Go necesita un director
\n\nImagina 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\nCuando 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\nEn 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\nUn 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 \norder-service:8082— carrito y pedidos \npayment-service:8083— transacciones \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.
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
Go es ideal para este rol: es ligero, rápido y permite manejar miles de solicitudes por segundo en un solo núcleo.
\n\nEscribiendo un API Gateway simple en Go: de la idea al código
\n\nConstruyamos 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.
Paso 1: Enrutamiento básico
\n\nEmpecemos con algo simple: dirigir solicitudes a diferentes servicios según la ruta.
\n\npackage 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\nEste 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?
Paso 2: Agregando middleware para JWT
\n\nLa verdadera magia de un API Gateway en Go ocurre en el middleware. Agreguemos una verificación de token JWT antes del proxy.
\n\npackage main\n\nimport (\n "context"\n "log"\n "net/http"\n "net/http/htt