Azure e Java: Implantando aplicações com Docker

Thomás da Costa
Nov 8 · 7 min read

Introdução

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:

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:

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

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

API Rest

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

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:

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:

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:

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 !!! :)

Thomás da Costa

Written by

Desenvolvedor Java, Professor de Algoritmos, entusiasta da Azure e Big Data, Colecionador de Videogames e Quadrinhos.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade