Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kotlin, Gradle y la nube

By Joshua FoxFeb 22, 20214 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Se diseñó con todas las características propias de un lenguaje de programación moderno que Java va incorporando poco a poco, pero que no se pueden añadir por completo de forma retroactiva, como:

  • Inferencia de tipos
  • Lambdas
  • Pattern matching
  • Funciones que no son métodos
  • Null safety
  • Smart casts
  • …y mucho más.

Kotlin interopera fácilmente con Java, lo que da acceso a una enorme variedad de librerías con un costo de transición mínimo.

Si bien Kotlin se conoce sobre todo como lenguaje oficial para Android, es un lenguaje de propósito general, y me dio curiosidad usarlo en la nube — dentro de un contenedor Docker, claro. Así que decidí probarlo, apoyándome en mi experiencia con Java.

Aunque tengo más experiencia con Maven como herramienta para gestionar dependencias y compilar código Java, también me propuse aprender algo de Gradle, ya que se prefiere ligeramente sobre Maven a la hora de compilar aplicaciones en Kotlin.

Sigue leyendo para ver cómo lograrlo.

Nubes sobre la isla de Kotlin

Instrucciones

  • Instala Docker.
  • Instala Gradle. El gestor de paquetes de tu sistema operativo te ayudará: en Mac, basta con brew install.
  • De aquí en adelante, puedes simplemente copiar mi proyecto sencillo y trabajar a partir de ahí. O bien sigue estos pasos para llegar al mismo resultado.
  • Configura tu proyecto Gradle/Kotlin. Esta guía del lado de Kotlin es útil, al igual que esta otra del lado de Gradle. Las combinaré y explicaré cómo configurar una nueva aplicación de la forma más sencilla posible.
  • Crea tu directorio y entra en él. Por ejemplo, mkdir multicloud_pubsub && cd multicloud_pubsub.
  • Ejecuta gradle init e ingresa lo siguiente en los menús interactivos: 2 (application), 4 (Kotlin), 1 (no: un único proyecto de aplicación), 1 (build scripts en Groovy), Enter y Enter para dejar los nombres por defecto del proyecto y del paquete del código de ejemplo.
  • Escribe gradle run para obtener un precioso "Hello World!".
  • Para agregar tu propio código, continúa como en mi proyecto de ejemplo aquí en Github— que es una pequeña parte de una aplicación asíncrona diseñada para lograr el máximo desacoplamiento y robustez frente a la inestabilidad de la nube. Pronto pienso escribir un artículo aparte sobre eso.
  • Coloca el código en un subdirectorio basado en el paquete dentro de src/main/kotlin, y elimina el código de ejemplo de src/main/kotlin y src/test/kotlin.
  • Elimina la dependencia de ejemplo guava en build.gradle y agrega tus propias dependencias. Son los mismos identificadores de artefacto que usas en Maven, pero con una sintaxis más legible.
compile 'com.google.cloud:google-cloud-pubsub:1.42.0'
compile 'com.google.cloud:google-cloud-storage:1.42.0'
compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
  • Edita el mainClass en build.gradle, en este caso 'com.doitintl.mulicloud.ProcessorKt'. Fíjate en el sufijo Kt del nombre del archivo: corresponde a una clase sintética que da acceso a la función main.
  • Agrega lo siguiente al final de build.gradle. Genera un archivo jar todo-en-uno que se puede ejecutar con java -jar app.jar.
jar {
    manifest { attributes 'Main-Class': mainClass }
    from { configurations.implementation.collect {
          it.isDirectory() ? it : zipTree(it) } }
}
  • Pruébalo con gradle clean run.
  • ¡Y ahora, a la nube! Coloca este Dockerfile en el directorio.
  • Ten en cuenta que usamos una imagen separada de Gradle en tiempo de compilación, lo que nos permite usar una imagen ligera y limpia en tiempo de ejecución.
  • Usamos la imagen de Java de OpenJDK. La librería estándar de runtime de Kotlin se compila junto con la aplicación, así que no hace falta una imagen de Kotlin.
  • Compila la imagen. No olvides el punto al final para indicar el directorio de compilación.
docker build -t pubsubapp .

Ahora ejecútala.

docker run pubsubapp

¡Y eso es todo! Como las imágenes de Docker son maravillosamente autocontenidas, el conocimiento que ya tengas sobre aplicaciones construidas con cualquier otra tecnología se aplica igual a una construida con Kotlin y Gradle. Aún quedan tareas pendientes, como crear cuentas de servicio y asignar roles, como de costumbre; he preparado un script para eso. (Revisa el README.)