API Gateway para servicios Kotlin: cuando una entrada es mejor que mil
Imagina que tu zoológico de microservicios en Kotlin ha crecido hasta tener más de 20 servicios. Cada uno se comunica con el mundo a través de su propio puerto, requiere su propia autenticación y maneja los errores a su manera. Los clientes se confunden con los endpoints, y tú rezas cada noche para que un servicio extra no se caiga y entierre toda la aplicación. ¿Te suena familiar?
Hay una solución: el API Gateway. Es un punto de entrada único que se encarga del enrutamiento, la seguridad, el almacenamiento en caché y la monitorización. Hoy analizaremos cómo construir un gateway de este tipo en Kotlin, utilizando dos enfoques populares: el ligero Ktor y el industrial Spring Cloud Gateway. Sin rodeos: solo código y práctica.
¿Qué es un API Gateway y por qué lo necesitas?
Un API Gateway (puerta de enlace API) es una capa intermedia entre los clientes y tus microservicios. En lugar de que cada frontend o aplicación externa conozca las direcciones de todos tus servicios, se comunican únicamente con el gateway. Y este decide hacia dónde dirigir la solicitud.
Funciones principales del gateway:
- Enrutamiento: dirige las solicitudes a los servicios adecuados según la URL o los encabezados.
- Autenticación y autorización: verifica los tokens antes de que la solicitud llegue a la lógica de negocio.
- Balanceo de carga: distribuye las solicitudes entre las instancias de un mismo servicio.
- Almacenamiento en caché: guarda respuestas para datos solicitados con frecuencia.
- Monitorización y registro: recopila métricas de todas las solicitudes en un solo lugar.
- Limitación de tasa (Rate limiting): protege contra DDoS y sobrecargas.
Si programas en Kotlin y utilizas una arquitectura de microservicios, un API Gateway es imprescindible, no una opción. Sin él, corres el riesgo de tener un caos de endpoints dispersos y problemas de seguridad.
Enfoque 1: API Gateway con Ktor — ligereza y flexibilidad
Ktor es un framework de JetBrains, creado específicamente para Kotlin. Es asíncrono, ligero y perfecto para escribir gateways cuando no quieres cargar con un pesado Spring Boot.
Escribamos un API Gateway simple en Ktor que enrute solicitudes a dos servicios: user-service (usuarios) y order-service (pedidos).
Paso 1: Configuración del proyecto
Crea un nuevo proyecto Ktor a través de start.ktor.io o agrega las dependencias manualmente en build.gradle.kts:
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-client-core:2.3.7") implementation("io.ktor:ktor-client-cio:2.3.7") implementation("io.ktor:ktor-server-auth:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") implementation("ch.qos.logback:logback-classic:1.4.14")}Paso 2: Enrutamiento básico con proxy
Creemos el archivo principal Application.kt:
import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*import io.ktor.http.*import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.response.*import io.ktor.server.routing.*
fun main() { embeddedServer(Netty, port = 8080) { module() }.start(wait = true)}
fun Application.module() { val httpClient = HttpClient()
routing { // Proxy para user-service route("/api/users") { handle { val response = httpClient.get("http://localhost:8081${call.request.uri}") call.respondText( text