Microservices com Kotlin, Spring boot e Kubernetes rodando na Google Cloud
Este artigo tem o objetivo de mostrar como criar um micro serviço utilizando Kotlin como linguagem, Spring Boot como framework, JIB para construir suas imagens sem necessidade de se aprofundar no docker, Skaffold para simplificar o deploy no kubernetes e o google cloud como ambiente de execução.
Você pode encontrar muitos exemplos de microsserviços desenvolvidos com Spring Boot em meu blog, mas a maioria deles é escrita em Java. Com o aumento da popularidade da linguagem Kotlin, principalmente depois que o google a definiu como linguagem oficial do Android, ela tem se tornado uma opção interessante para a criação de serviços e ela é frequentemente usada com um framework muito conhecido e querido pela comunidade java, o Spring Boot.
Estou utilizando o Intellij como Ide para trabalhar com kotlin, vamos começar o projeto criando um serviço usando spring boot e kotlin, para isso iremos utilizar o site https://start.spring.io/ para gerar a base do projeto, lá colocamos as dependências que iremos utilizar no projeto. No fim do artigo irei deixar o link para o github com o projeto finalizado.
Criando o microservice com Kotlin
Vamos começar criando o nosso controller de Products, não irei me extender muito pois é bastante similar ao nossos controllers com java e spring boot, os nossos métodos em kotlin são declarados com fun, o retorno é definido depois da declaração dos argumentos, quando uma função retorna uma única expressão, as chaves podem ser omitidas e o corpo é especificado após um ‘=’
Aqui temos o nosso service para products
Agora o nosso repository, praticamente igual ao repository em java usando spring data
E o nosso Model, nele temos algumas particularidades extras, primeiro as classes de dados são marcadas com ‘data’, os campos passados no construtor primário automaticamente possuem algumas funções extras —
equals()/ hashCode()
toString()
componentN()
copy()
Acaba se tornando bem similar as classes java que utilizam o Lombok
Criando a imagem com Jib
Jib é um plugin do mavem/graddle, projetado para construir imagens Docker e OCI otimizadas para seus aplicativos Java sem um daemon Docker, nós não precisamos escrever um Dockerfile com ele.
O Jib é implementado em Java e é executado como parte do build do Maven ou Gradle. A abordagem de construção do Jib separa o aplicativo Java em várias camadas, de forma que quando existirem alterações no código, somente as mudanças serão reprocessadas, ao invés de toda a aplicação. Por padrão, essas camadas são colocadas em cima de uma imagem base distroless, que é uma imagem que contém somente a aplicação do desenvolvedor e dependências de tempo de execução.
Para adicionar o Jib no seu projeto, adicione o plugin do Jib no seu pom.xml
Adicionando Skaffold ao projeto
Skaffold é uma ferramenta de linha de comando que facilita o desenvolvimento contínuo para aplicativos Kubernetes, o Skaffold não só automatiza o processo de build e deploy de uma aplicação no cluster Kubernetes, mas consegue ir além, sendo capaz de monitorar cada nova mudança no código e realizar todo o trabalho automaticamente para você, sem que seja preciso realizar nenhuma ação adicional.
Com isso em mente, você apenas se preocupa em programar sua aplicação e toda a alteração que o código receber vai se refletir automaticamente no cluster Kubernetes em poucos segundos, como se você tivesse um pipeline configurado localmente.
O Skaffold serve tanto para uso remotamente em algum Cloud Provider, quanto localmente utilizando um Minikube ou o Kind.
Aqui é como está o nosso arquivo de configuração do Skaffold
Kubernetes
Pods — Os pods são as menores unidades de computação implantáveis que você pode criar e gerenciar no Kubernetes.
Um pod é um grupo de um ou mais contêineres, com armazenamento compartilhado e recursos de rede, e uma especificação de como executar os contêineres.
Nós iremos precisar também de dois arquivos do kubernetes, o deployment.yml e o service.yml, colocaremos ambos dentro da pasta k8s, na raiz do nosso projeto.
Deployment- O deployment fornece atualizações declarativas para pods e ReplicaSets. Você descreve um estado desejado em um deployment, e o controlador de deployment altera o estado real para o estado desejado em uma taxa controlada. Você pode definir deployments para criar novos ReplicaSets ou remover deployment existentes e adotar todos os seus recursos com novos.
Service — Uma maneira de expor um aplicativo em execução em um conjunto de pods como um serviço de rede.
Com o Kubernetes, você não precisa modificar seu aplicativo para usar um mecanismo de descoberta de serviço desconhecido. O Kubernetes fornece aos pods seus próprios endereços IP e um único nome DNS para um conjunto de pods e pode balancear a carga entre eles.
Configure o kubectl para conectar o Google Kubernetes Engine
Primeiro criamos e startamos um cluster kubernetes, como mostrado na imagem, então clique em connect e pegue o código para configurar as credenciais gcloud e kubectl para realizar a conexão ao cluster, ele inicia com ‘gcloud’, então o comando kubectl config get-context, Ele exibe todos os contextos kubectl usados anteriormente e marca o contexto usado atualmente.
Agora precisamos apenas executar o comando skaffold dev — port-forward no diretório raiz do projeto. Antes de executar esse comando, você deve ter configurado as credenciais para o seu repositório Docker Hub.
Se o comando Skaffold for concluído com sucesso, podemos verificar os resultados. O aplicativo foi enviado ao meu repositório Docker Hub e uma nova implantação e serviço foram criados no GKE. Graças ao Skaffold — port-forward, podemos facilmente testar localmente o aplicativo em execução no Google Cloud Platform. Podemos chamar o endpoint do actuator pro http://localhost:8080/actuator/info.
Conclusão
O Kotlin simplifica e acelera a criação de aplicativos Spring Boot. Skaffold e Jib simplificam a criação e execução de contêineres no Kubernetes, com isso conseguimos criar serviços com alta qualidade e grande produtividade.
Segue o código do nosso projeto no github.
https://github.com/Odilio/kotlin-springboot-kubernetes
Tentarei avançar na construção de serviços com kotlin, mostrando o uso do kafka, grpc e outras buzzwords do universo dos serviços.