Como criar o primeiro microsserviço com opentrace em Kotlin

No items found.
21/2/2020
Eliezer Rodrigues
Eliezer Rodrigues
Senior Software Developer

Apaixonado por desenvolvimento de software, fotógrafo e tenista.

Está sem tempo para ler? Aperte o play para escutar o artigo.

Um time de infraestrutura ou times que operam um serviço podem usar o rastreamento distribuído para monitorar ou depurar o comportamento de arquiteturas de microsserviços, ajudando assim os desenvolvedores no debug e otimização do código.

O que vamos precisar?

  • 15 minutos
  • Java 11 ou superior
  • Editor de favorito ou IDE
  • Docker

Como usar na prática um framework de opentracing em um microsserviço kotlin?

Existem várias opções aqui para utilizar uma forma de tracing, mas o Uber fez uma implementação do padrão opentracing chamada Jaeger. Claro que é open source e está no GitHub. Vamos utilizar ela com uma aplicação springboot com kotlin e também com feign.

Inicializando o Jaeger com docker

Antigamente nós, developers, demorávamos dias configurando ambiente, mas isso é passado, temos imagem docker pra quase tudo hoje em dia. Esse comando vai baixar a imagem oficial e deixar rodando para gente utilizar. 

<p> CODE: https://gist.github.com/eliezer/ee2aa60eedacaa428a32fbdbc202aad7.js</p>

Acesse no seu navegador preferido: "http://localhost:16686"

kotlin

Pronto, uma instância de Jaeger rodando na porta 5775 udp para receber tracing da aplicação e outra porta 16686 para acesso a interface web.

O nosso serviço de CEP

A Ideia é criar um microsserviço de busca de endereço simples que vai utilizar uma API na internet para exemplificar o uso de jaeger com feign. Um serviço de busca de endereço por CEP que vai usar uma outra API (viacep) para realizar a busca.

Algo assim:

opentracing


Criando a nossa aplicação com api do Springboot-Initializr 

O projeto springboot-initializr pode ser utilizado via web site ou via API. Vamos já utilizar um Script shell que já baixa nosso projeto com as dependências necessárias e já descompacta em um diretório "address".

<p> CODE: https://gist.github.com/eliezer/ed84f0d56ce01cf04c01015a251052e7.js</p>

Esse projeto utiliza maven e não é necessário fazer a instalação em seu computador, por o próprio spring-initializr já coloca o wrapper do maven como padrão, sendo necessário só dar permissão para executar e compilar a aplicação.

<p> CODE: https://gist.github.com/eliezer/b4bd11922c70a23a531b0c740f1f6a72.js</p>

Tudo certo! Teremos algo assim:

microsserviço

Rodando a aplicação somente para verificar se está tudo em ordem. O Actuator é um sub-projeto do spring boot  que te ajuda muito para conseguir métricas e monitoramento de sua aplicação. Ele vai expor automaticamente um endpoint de health-check em /actuator/health e vamos usar ele.

<p> CODE: https://gist.github.com/eliezer/9bad8fdd499256c33e77fa5604051351.js</p>

shell

<p> CODE: https://gist.github.com/eliezer/e8d7311db62a8f2ac9b2a6a2ac22cbdc.js</p>

Agora com um escopo definido de negócio que é a busca de endereço usando um CEP, temos um jaeger rodando em docker e também nossa aplicação spring boot funcionando na porta 8080 com actuator.

Criando nossa interface de serviço para busca de endereço

Vamos criar uma interface de serviço que usa o serviço na internet de forma didática, poderia ser qualquer outro serviço.  

O serviço que faz a busca de CEP:


<p> CODE: https://gist.github.com/eliezer/3a3ed23339807d65451fb292e50eb3ac.js</p>

O projeto Feign criado pela Netflix, é um client HTTP feito em java, que vem para facilitar como fazemos nossas integrações com outros serviços. Em resumo, você cria uma interface e usa suas anotações para decorar como será sua requisição. Para quem usa a implementação desta interface fica transparente, é como chamar um método simples, mas será executado uma requisição HTTP. 

Vamos criar a interface em kotlin que representa esse serviço.


<p> CODE: https://gist.github.com/eliezer/265a18d1f5e6607e2c98fd1a5fc89b70.js</p>

O Controller em kotlin

Vamos fazer do nosso microserviço usando injeção de dependência do serviço addressService que representa a implementação da nossa interface feign que criamos. É um microsserviço simples que basicamente faz uma delegação para o serviço que faz realmente nossa busca de CEP, lembrando que esse exemplo é didático.


<p> CODE: https://gist.github.com/eliezer/3ec83a5bf104b6aaa5583ea9d8582e82.js</p>

Ao utilizar o as interfaces feign, é necessário adicionar a annotation @EnableFeignClients para funcionar a injeção do client feign no controller.

<p> CODE: https://gist.github.com/eliezer/38df63ace25764c56ea9cc4d8488f7b0.js</p>

Pronto! Agora reinicie nossa aplicação.

<p> CODE: https://gist.github.com/eliezer/9bad8fdd499256c33e77fa5604051351.js</p>

Testando o nosso serviço

<p> CODE: https://gist.github.com/eliezer/6b83c9c8507d8835c04c0ed87d64cff6.js</p>

Simples, né? Spring boot é uma ferramenta sensacional para plataforma java, além de simplificar muita coisa, reduz muito tempo de desenvolvimento. Vamos colocar nosso amigo jaeger e visualizar em sua interface web o tracing da request funcionando.

Adicionando o jaeger ao projeto

Nosso projeto maven veio com muita coisa pronta do setup inicial, mas agora vamos adicionar as dependências do opentracing-spring-jaeger no nosso pom.xml.


<p> CODE: https://gist.github.com/eliezer/e81e5850a8248e207f6f9627ca5199d7.js</p>

Também é necessário adicionar a configuração do jaeger no nosso arquivo de configuração application.properties, com isso a nossa aplicação vai conhecer para qual servidor de Jaeger deve ser enviado as informações de tracing.


<p> CODE: https://gist.github.com/eliezer/8285348c880c2eaf1d886c341788052d.js</p>

Pronto, agora reinicie nossa aplicação novamente com a configuração do Jeager.

<p> CODE: https://gist.github.com/eliezer/9bad8fdd499256c33e77fa5604051351.js</p>

Refaça o request do nosso serviço:

<p> CODE: https://gist.github.com/eliezer/b4e398b57fbb42ee44052f316cadd249.js</p>

Visualizando o resultado no jaeger

Com uma interface simples e bem intuitiva o Jaeger-UI pode ser acessado em http://localhost:16686/ e com isso podemos selecionar o serviço "microservice-address" e depois em "Find Traces".

jaeger

Com apenas um tracing na tela, vamos selecionar nosso request findAddres para exibir um detalhamento do que aconteceu nesse processo.

jaeger


Simples assim! 

Todas as informações da transação entre serviço unificado em uma única interface e com rastreabilidade no jaeger. É possível ver informações importantes da requisição, quanto tempo gastou, o que foi chamado de recurso, etc.

A ideia deste artigo foi mostrar o quanto é simples usar springboot + kotlin + feign + jaeger. Claro que tem muito mais para saber sobre opentracing, principalmente no mundo de microsserviços. 

Temos o código disponível aqui dessa demo.

Quer saber mais detalhes sobre o assunto? Veja aqui.

Ainda ficou com alguma dúvida? Conta pra gente nos comentários! 

O que você achou deste conteúdo?
Quer receber nossos conteúdos?
Seu cadastro foi efetuado com sucesso! Enviaremos as novidades no seu email.
Oops! Something went wrong while submitting the form.