¿Por qué Kotlin es la mejor opción para microservicios en 2024?
\n\n¿Alguna vez has escrito un microservicio en Python y luego has pensado: «¿Y si funcionara más rápido, consumiera menos memoria y el código siguiera siendo igual de legible?» ¿Te suena familiar? Entonces bienvenido al mundo de Kotlin, el lenguaje que Google eligió para Android y la comunidad de desarrolladores backend para crear microservicios ligeros y de alto rendimiento.
\n\nKotlin encaja perfectamente en la arquitectura de microservicios: es de tipado estático, se compila a bytecode de JVM (o código nativo mediante Kotlin/Native), pero sin requerir toneladas de código repetitivo como Java. Y lo más importante: sus corrutinas (coroutines) permiten procesar miles de solicitudes en un solo hilo sin el dolor del callback hell.
\n\nEn este artículo no daremos lecciones teóricas. Vamos a escribir dos microservicios: User Service (REST API) y Notification Service (simulación de envío de correos). Todo en Kotlin puro + Ktor. ¡Allá vamos!
\n\n1. Herramientas: qué instalar antes de empezar
\n\nAntes de escribir código, asegurémonos de que tu ordenador está listo para la acción.
\n\nQué necesitas instalar:
\n- \n
- JDK 17+ — Kotlin funciona en la JVM, así que no puedes prescindir de Java. Puedes descargarlo desde Adoptium. \n
- IntelliJ IDEA Community Edition — el mejor IDE para Kotlin (sí, es de JetBrains y sí, es gratuito). \n
- Gradle (o Maven) — sistema de compilación. En IntelliJ ya viene integrado, pero si quieres instalarlo por separado: gradle.org. \n
- Docker (opcional, pero facilita mucho el despliegue). \n
Si tienes macOS o Linux, ya estás a medio camino del éxito. En Windows recomiendo WSL2.
\n\n2. Creamos nuestro primer microservicio: User Service con Ktor
\n\nKtor es un framework creado por los desarrolladores de Kotlin. Es extremadamente ligero: tú decides qué módulos conectar (enrutamiento, serialización, registro). Sin magia, solo código limpio.
\n\n2.1. Generación del proyecto
\nLa forma más rápida es usar el Generador de Proyectos Ktor. Selecciona:
\n- \n
- Sistema de compilación: Gradle Kotlin DSL \n
- Motor: Netty (el más popular) \n
- Plugins: Routing, Content Negotiation (JSON), Status Pages \n
Descarga el archivo, ábrelo en IntelliJ y en 2 minutos tendrás un esqueleto listo.
\n\n2.2. Escribimos la REST API: obtención de usuarios
\nCreemos un modelo simple y un endpoint. El código será lo más legible posible:
\n\n// Model.kt\ndata class User(\n val id: Int,\n val name: String,\n val email: String\n)\n\n// UserRepository.kt\nobject UserRepository {\n private val users = mutableListOf(\n User(1, "Alice", "alice@example.com"),\n User(2, "Bob", "bob@example.com")\n )\n\n fun findAll(): List<User> = users\n fun findById(id: Int): User? = users.find { it.id == id }\n}\n\n// Application.kt (punto de entrada)\nfun main() {\n embeddedServer(Netty, port = 8080) {\n configureSerialization()\n configureRouting()\n }.start(wait = true)\n}\n\n// Routing.kt\nfun Application.configureRouting() {\n routing {\n route("/api/v1/users") {\n get {\n call.respond(UserRepository.findAll())\n }\n get("/{id}") {\n val id = call.parameters["id"]?.toIntOrNull()\n if (id == null) {\n call.respond(HttpStatusCode.BadRequest, "Invalid ID")\n return@get\n }\n val user = UserRepository.findById(id)\n if (user != null) {\n call.respond(user)\n } else {\n call.respond(HttpStatusCode.NotFound, "User not found")\n