Azure e Java: Implantando aplicações com Docker

Iremos desenvolver uma aplicação para obter as informações da API do Twitter e indicar qual o usuário que possui mais seguidores de acordo com as hashtag especificas em um filtro de pesquisa. No nosso caso, as hastags serão configuradas previamente como parâmetro da aplicação.

Após a construção do aplicativo, iremos implantar as aplicações usando o Azure Container Instances e o Serviços de Aplicativo do Azure.

Repositórios

Acesse os repositórios dos códigos fontes e das imagens dos containers. No Github, leia os README que ajudam na compilação e execução do projeto.

Tecnologias

Abaixo segue a lista de tecnologias utilizadas para o desenvolvimento das aplicações:

Azure Container Instances

É um serviço da Azure para implantar container de forma simples e rápida. O principal objetivo é para subida de aplicações sem a necessidade de recorrer a VM’s tradicionais. No nosso caso, teremos uma aplicação standalone consumidora das informações do Twitter e ao invés de subirmos como um Webjob ou criar uma VM para efetuar a implantação, utilizaremos o Azure Container Instance para facilitar todo esse processo. A desvantagem desse recurso da Azure é que não existe a forma de escalonar ou de orquestrar os serviços. Para esse fim, utilize o AKS (Serviço de Kubernetes do Azure).

Serviços de Aplicativo da Azure

É o serviço da Azure para implantação de aplicações web em várias linguagens de programação e ambientes. No nosso processo, vamos utilizar a implantação via imagem do Docker Hub.

Arquitetura da Aplicação

No nosso exemplo, iremos utilizar os seguintes módulos:

  • Twitter Consumer: aplicação que vai consumir as informações da API do Twitter e persistir os dados no Redis de acordo com hastags especificadas na configuração da aplicação.
  • Twitter API: API Rest para consumir as informações consolidadas no Redis e exibir a lista do top 5 usuários com maiores seguidores.
  • Redis: Banco NoSQL chave valor para armazenar as informações.

Twitter API

Para acesso a API do Twitter, é necessário efetuar o cadastro no site https://developer.twitter.com/en/apps e criar uma nova aplicação. O processo de cadastramento pode não ser imediato e dependendo, o Twitter pode efetuar mais questionamentos através de e-mail para entender a real necessidade de utilização das API’s.

Portal de desenvolvedor do Twitter com uma aplicação criada.

Com a aplicação criada, será necessário utilizar os Keys e Tokens dentro da aplicação consumidora.

Olha os Keys e Tokens aí!!! Falha de segurança exibir isso? Pode ser mas a aplicação não existe mais 🙂

Biblioteca twitter4j

Foi desenvolvido com o objetivo de obter as informações da API do Twitter de forma simples. Para utilizar a biblioteca, incluir a dependência no pom.xml.

<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-stream</artifactId>
<version>4.0.6</version>
</dependency>

O código abaixo mostra como efetuar uma busca filtrando por hastag:

https://gist.github.com/862a1d6774acdc9e5e1d1ec4dce69ce1

Aplicação Consumidora

A aplicação consumidora obtém as informações do Twitter e efetua a gravação no Redis. O código abaixo mostra este processo:

https://gist.github.com/681f9b01dcd51dbafd32c7fdf74431ca

Para inserir as informações no Redis utilizaremos o Pipeline que possui uma performance superior para gravar enorme volumes de dados:

https://gist.github.com/3e13db2e4e4325b75988716bb718b3b6

A aplicação ficará em execução utilizando @Scheduled do Spring:

https://gist.github.com/3ce36783d26fe49567d97b6709abc971

API Rest

A API busca as informações no Redis e ordenar os usuários de acordo com o número de seguidores:

https://gist.github.com/85ec00de432ac1b87bffa0f5793e2267

Gerando os container

Cada aplicação possui um Dockerfile para efetuar a criação da imagem:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar

A variável de ambiente JAVA_OPTS é a forma de passar as configurações do servidor do Redis e as chaves e tokens do Twitter para a aplicação.

Para efetuar a geração da imagem do projeto, utilize o comando abaixo (nesse caso o exemplo é do consumidor):

docker image build --build-arg JAR_FILE=target/twitter-consumer.jar --tag thomasdacosta/twitter-consumer:latest .

Enviando a imagem para o Docker Hub:

docker push thomasdacosta/twitter-consumer:latest

Gerando os container via Maven

O projeto possui o Spotify dockerfile-maven para geração das imagens do container:

https://gist.github.com/c476eebbd630fed8366105350f3629e5

Usar o comando para gerar a imagem:

mvn clean install -P docker

Executando

Para efetuar os testes em cada módulo, podemos executar manualmente cada container com o comando docker container run ou utilizar o docker-compose.yml:

https://gist.github.com/63094347f0441c63c80d5b48024485c8

Implantando com Azure Container Instances

Iremos implantar o Redis e a aplicação consumidora no Azure Container Instances. A API será implantada diretamente no Serviço de Aplicativo da Azure. Para acessar o Azure Container Instances, utilize a opção da imagem abaixo ou efetue a pesquisa pelo nome de serviço na barra superior do Portal da Azure.

Implantando o Redis

  • Criar a aplicação com as informações abaixo:
  • Defina a porta do serviço:
  • Incluir o comando de execução inicial do container:
[ "redis-server", "--appendonly yes", "--requirepass twitterdemo" ]
  • Crie o container e aguarde o processo de provisionamento do recurso:
  • Se o log for exibido da forma abaixo, a implantação foi efetuada com sucesso:

Aplicação Consumidora

  • Criar a aplicação com as informações abaixo:
  • A aplicação não precisa ter acesso externo:
  • Incluir a variável de ambiente JAVA_OPTS com o valor do quadro abaixo.
  • As hastags são configuradas no parâmetro -DhashTag separadas por virgula e no parâmetro -Dspring.redis.host, incluir o IP do container do Redis criado no passo anterior.
-Dtwitter4j.debug=true 
-Dtwitter4j.oauth.consumerKey=***
-Dtwitter4j.oauth.consumerSecret=***
-Dtwitter4j.oauth.accessToken=***
-Dtwitter4j.oauth.accessTokenSecret=***
-Dspring.redis.port=6379
-Dspring.redis.host=ip_do_redis
-Dspring.redis.password=twitterdemo
-Dredis.ssl=false
-DhashTag=#azure,#microsoft
  • Crie o container e aguarde o processo de provisionamento do recurso:
  • Se o log for exibido da forma abaixo, a implantação foi efetuada com sucesso:

Implantando no Serviços de Aplicativo da Azure

Vamos efetuar a implantação da API que irá exibir o ranking dos usuários com mais seguidores. Procure pelo serviço utilizando a barra de pesquisa no Portal da Azure

  • Criar a aplicação com as informações abaixo:
  • Incluir as informações para efetuar o download da imagem no Docker Hub:
  • Crie a aplicação e aguarde o processo de provisionamento do recurso:
  • Aplicação foi criada com o seu respectivo Plano do Serviço de Aplicativo:
  • Incluir as configurações de JAVA_OPTS para que a aplicação acesse as informações do Redis:
-Dspring.redis.port=6379 
-Dspring.redis.host=ip_do_redis
-Dspring.redis.password=twitterdemo
-Dredis.ssl=false
  • Confirme as alterações e reinicie a aplicação. Depois efetue um teste através do Postman para verificar se está tudo funcionando:

Devops

Todo processo acima pode ser efetuado utilizando o Azure Devops ou usando o CLI da Azure. Em um próximo artigo, vamos detalhar esse processo de deploy da aplicação de forma automatizada.

Travis CI

Para o processo de Integração Continua, foi utilizado o Travis CI que é uma ferramenta open source, que se integra automaticamente com o Github. Incluindo o arquivo .travis.yml na raiz do seu projeto e habilitando no site do Travis, a sua aplicação será compilada a cada push efetuado no Github.

Arquivo de configuração do Travis utilizado em nosso exemplo:

https://gist.github.com/29351131d5732bce41956573e5122b8e

Conclusão

Demonstramos o processo de implantação de uma aplicação Java utilizando Docker utilizando os recursos mais simples e baratos da Azure. Caso precise de algo mais elaborado como orquestração e descoberta de serviços utilizar o AKS (Serviço de Kubernetes do Azure).

Até a próxima!

https://thomasdacosta.com.br

Deixe um comentário

Site desenvolvido com WordPress.com.

Acima ↑