
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.
- Github: https://github.com/thomasdacosta/medium-twitter-demo
- Docker Hub: https://hub.docker.com/u/thomasdacosta
- Travis CI: https://travis-ci.org/thomasdacosta/twitter-demo
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.

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

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!
Deixe um comentário