Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kotlin, Gradle e il cloud

By Joshua FoxFeb 22, 20214 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

È nato con tutte le caratteristiche di un linguaggio di programmazione moderno che Java sta lentamente acquisendo, ma che non possono essere integrate completamente a posteriori, come ad esempio:

  • Type inference
  • Lambda
  • Pattern matching
  • Funzioni non legate a metodi
  • Null safety
  • Smart cast
  • …e molto altro.

Kotlin si integra facilmente con Java, dando accesso a un'ampissima scelta di librerie con costi di transizione minimi.

Sebbene Kotlin sia noto soprattutto come linguaggio ufficiale di Android, è in realtà un linguaggio general-purpose, ed ero curioso di metterlo alla prova nel cloud — dentro un container Docker, ovviamente. Così ho deciso di provarci, sfruttando la mia esperienza con Java.

Pur avendo più dimestichezza con Maven per gestire le dipendenze e compilare codice Java, ho voluto imparare anche un po' di Gradle, dato che per le applicazioni Kotlin è leggermente preferito a Maven.

Continui a leggere per scoprire come fare.

Nuvole sopra l'isola di Kotlin

Istruzioni

  • Installi Docker.
  • Installi Gradle. Il package manager del suo sistema operativo le darà una mano: su Mac basta brew install
  • Da qui in poi, può semplicemente copiare il mio piccolo progetto e partire da lì. Oppure seguire questi passaggi per arrivarci.
  • Configuri il progetto Gradle/Kotlin. Questa guida sul versante Kotlin è utile, così come questa sul versante Gradle. Le metterò insieme spiegando come avviare una nuova app nel modo più semplice possibile.
  • Crei la directory e ci si sposti dentro. Ad esempio, mkdir multicloud_pubsub && cd multicloud_pubsub.
  • Esegua gradle init, quindi selezioni queste opzioni nei menu interattivi: 2 (application), 4 (Kotlin), 1 (no: solo un progetto applicativo), 1 (script di build in Groovy), Enter ed Enter per i nomi predefiniti del progetto e del sample source package.
  • Digiti gradle run per ottenere uno splendido "Hello World!"
  • Per aggiungere il proprio codice, proceda come nel mio progetto di esempio disponibile qui su Github — è una piccola parte di un'app asincrona pensata per garantire il massimo disaccoppiamento e la massima robustezza di fronte all'instabilità del cloud. Conto di dedicargli presto un articolo a parte.
  • Inserisca il codice in una sottodirectory basata sul package sotto src/main/kotlin, ed elimini il codice di esempio in src/main/kotlin e src/test/kotlin.
  • Elimini il guava di esempio in build.gradle e aggiunga le proprie dipendenze. Sono gli stessi identificatori di artifact che si usano in Maven, ma con una sintassi più leggibile.
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'
  • Modifichi mainClass in build.gradle, in questo caso 'com.doitintl.mulicloud.ProcessorKt'. Noti il suffisso Kt nel nome del file, che indica una classe sintetica che dà accesso alla funzione main.
  • Aggiunga quanto segue in coda a build.gradle. Genera un file jar all-in-one utilizzabile con java -jar app.jar
jar {
    manifest { attributes 'Main-Class': mainClass }
    from { configurations.implementation.collect {
          it.isDirectory() ? it : zipTree(it) } }
}
  • Lo verifichi con gradle clean run.
  • E ora, in cloud! Inserisca questo Dockerfile nella directory.
  • Da notare che in fase di build usiamo un'immagine Gradle separata, così a runtime possiamo affidarci a un'immagine leggera e pulita.
  • Utilizziamo l'immagine Java di OpenJDK. La libreria runtime standard di Kotlin viene inclusa nell'applicazione durante la build, quindi non serve un'immagine Kotlin.
  • Costruisca l'immagine. Non dimentichi il punto finale, che indica la directory di build.
docker build -t pubsubapp .

Ora la esegua.

docker run pubsubapp

Tutto qui! Dato che le immagini Docker sono splendidamente self-contained, le competenze maturate con app realizzate in qualunque altra tecnologia valgono allo stesso modo per una sviluppata con Kotlin e Gradle. Resta dell'altro da fare, come creare i service account e assegnare i ruoli, come sempre; ho preparato uno script apposito. (Consulti il README.)