Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kotlin, Gradle e a nuvem

By Joshua FoxFeb 22, 20214 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Foi criado com todos os recursos de uma linguagem de programação moderna que o Java vem incorporando aos poucos, mas que não dá para adaptar por completo, como:

  • Inferência de tipos
  • Lambdas
  • Pattern matching
  • Funções fora de métodos
  • Null safety
  • Smart casts
  • …e muito mais.

O Kotlin tem interoperabilidade fácil com Java, o que dá acesso a uma enorme variedade de bibliotecas com custo de transição mínimo.

Embora o Kotlin seja mais conhecido como linguagem oficial do Android, ele é uma linguagem de propósito geral, e fiquei curioso para usá-lo na nuvem — em um container Docker, claro. Então resolvi testar, aproveitando minha bagagem em Java.

Apesar de ter mais experiência com o Maven como ferramenta para gerenciar dependências e fazer build de código Java, também resolvi aprender um pouco de Gradle, já que ele é ligeiramente preferido em relação ao Maven para o build de aplicações Kotlin.

Continue lendo para ver como fazer isso na prática.

Nuvens sobre a Ilha de Kotlin

Instruções

  • Instale o Docker.
  • Instale o Gradle. O gerenciador de pacotes do seu sistema operacional resolve isso pra você: no Mac, basta um brew install
  • A partir daqui, fique à vontade para simplesmente copiar meu projeto simples e partir dele. Ou siga estes passos para chegar lá.
  • Configure seu projeto Gradle/Kotlin. Este guia pelo lado do Kotlin é útil, assim como este pelo lado do Gradle. Vou juntar os dois e mostrar como configurar uma nova aplicação da forma mais fácil possível.
  • Crie o diretório e entre nele. Por exemplo, mkdir multicloud_pubsub && cd multicloud_pubsub.
  • Execute gradle init e, em seguida, informe o seguinte nos menus interativos: 2 (application), 4 (Kotlin), 1 (no: only one application project), 1 (build scripts in Groovy), Enter e Enter para os nomes padrão do projeto e do pacote de exemplo.
  • Digite gradle run para ver um lindo "Hello World!"
  • Para adicionar seu próprio código, siga como no meu projeto de exemplo aqui no GitHub — que é uma pequena parte de uma aplicação assíncrona pensada para o máximo desacoplamento e robustez diante da instabilidade da nuvem. Pretendo escrever um artigo separado sobre isso em breve.
  • Coloque o código em um subdiretório baseado em pacote dentro de src/main/kotlin e apague o código de exemplo em src/main/kotlin e src/test/kotlin.
  • Apague o exemplo do guava em build.gradle e adicione suas dependências. São os mesmos identificadores de artefato usados no Maven, só que com uma sintaxe mais legível.
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'
  • Edite o mainClass em build.gradle, neste caso 'com.doitintl.mulicloud.ProcessorKt'. Repare no sufixo Kt no nome do arquivo, que corresponde a uma classe sintética que dá acesso à função main.
  • Adicione o seguinte ao final do build.gradle. Isso gera um arquivo jar completo, pronto para ser usado com java -jar app.jar
jar {
    manifest { attributes 'Main-Class': mainClass }
    from { configurations.implementation.collect {
          it.isDirectory() ? it : zipTree(it) } }
}
  • Teste com gradle clean run.
  • Agora, rumo à nuvem! Coloque este Dockerfile no diretório.
  • Repare que usamos uma imagem separada do Gradle em tempo de build, o que permite usar uma imagem leve e enxuta em tempo de execução.
  • Usamos a imagem Java do OpenJDK. A biblioteca runtime padrão do Kotlin já vem embutida no build da aplicação, então não é preciso uma imagem do Kotlin.
  • Faça o build da imagem. Não esqueça do ponto no final, que indica o diretório de build.
docker build -t pubsubapp .

Agora execute.

docker run pubsubapp

É isso! Como as imagens Docker são maravilhosamente autocontidas, todo o conhecimento que você adquiriu com aplicações construídas em outras tecnologias se aplica igualmente a uma feita com Kotlin e Gradle. Ainda tem coisa para fazer, como criar contas de serviço e conceder papéis, como de costume; criei um script para isso. (Veja o README.)