Microservices, Docker e Tecnologias de Mensageria parte 5
Hernani Almeida
Posted on March 3, 2022
Ferramentas necessárias:
Com nosso back estruturado vamos agora construir uma simples pagina web em Reactjs para vermos o funcionamento do sistema.
Como cereja do bolo vamos utilizar o poder do Docker e deixar tanto o ambiente como as aplicações (Front e Back) rodando dentro de contêineres docker.
Para nao prolongar muito o artigo deixo aqui o link para clonar o projeto onde já se encontra a aplicação do front.
Front
Para cada aplicação que construímos foi adicionado na pasta raiz um arquivo dockerfile
para gerar uma imagem docker de nossa aplicação.
dockerfile
FROM adoptopenjdk/openjdk11:latest
ARG JAR_FILE=target/*.jar
WORKDIR /opt/app
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Para conseguirmos fazer o build das nossas aplicações geramos o arquivo jar para cada uma delas, neste artigo vou demonstrar como gera-lo via intellij porem o mesmo pode ser gerado via cmd.
No canto superior direito do intellij clique na aba onde esta escrito maven, e no modal que ira abrir clique em cima do símbolo m
para chegar nesta tela.
De 2 cliques no comando mvn clean e após abra o modal novamente e de 2 cliques em mvn install, dentro da pasta target você vera que foi gerado um arquivo .jar.
Feito isso foi configurado em no arquivo docker-compose.yaml
os comandos para criar a imagem docker
, tendo como referencia o arquivo dockerfile
de cada aplicação, e subi nossas aplicações dentro do docker. Nosso arquivo ficou conforme abaixo.
docker-compose.yaml
version: '3'
services:
front:
container_name: front-microservices
build:
context: ../frontMicroservices
dockerfile: ./dockerfile
volumes:
- '../frontMicroservices:/app'
- '/app/node_modules'
ports:
- '3000:3000'
environment:
- NODE_ENV=development
ponteacesso:
container_name: ponte
build:
context: ../pontedeacesso
dockerfile: dockerfile
ports:
- '8080:8080'
depends_on:
- kafka
environment:
KAFKA_HOST: 172.18.0.1:9092
orquestrador:
container_name: orquestrador
build:
context: ../orquestrador
dockerfile: dockerfile
ports:
- '8081:8081'
depends_on:
- kafka
- elasticsearch
- mqseries
environment:
ELASTICSEARCH_HOST: 172.18.0.1:9200
KAFKA_HOST: 172.18.0.1:9092
MQ_HOST: tcp://172.18.0.1:61616
consumer:
container_name: consumerMq
build:
context: ../consumer
dockerfile: dockerfile
ports:
- '8082:8082'
depends_on:
- redis
- kafka
- mqseries
- postgres
environment:
POSTGRES_HOST: postgres
REDIS_HOST: "172.18.0.1"
REDIS_PORT: 6379
KAFKA_HOST: 172.18.01:9092
MQ_HOST: tcp://172.18.0.1:61616
mqseries:
image: ibmcom/mq:latest
ports:
- "1414:1414"
- "9443:9443"
hostname: mq
environment:
- LICENSE=accept
- MQ_QMGR_NAME=QM1
- MQ_ADMIN_PASSWORD=admin
container_name: mqserver
stdin_open: true
tty: true
restart: always
mq:
image: rmohr/activemq
container_name: mq
ports:
- 8161:8161
- 61616:61616
- 5672:5672
- 1883:1883
- 61613:61613
zookeeper:
image: "confluentinc/cp-zookeeper:5.2.1"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_SYNC_LIMIT: 2
kafka:
image: "confluentinc/cp-kafka:5.2.1"
ports:
- 9092:9092
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://172.18.01:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
postgres:
image: 'postgres:alpine'
volumes:
- postgres-volume:/var/lib/postgresql/data
ports:
- 5432:5432
environment:
POSTGRES_USER: bootcamp
POSTGRES_PASSWORD: password
POSTGRES_DB: bootcamp
POSTGRES_HOST: postgres
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.3.1
container_name: elasticsearch
environment:
- node.name=ws-es-node
- discovery.type=single-node
- cluster.name=ws-es-data-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
# - xpack.security.enabled='false'
# - xpack.monitoring.enabled='false'
# - xpack.watcher.enabled='false'
# - xpack.ml.enabled='false'
# - http.cors.enabled='true'
# - http.cors.allow-origin="*"
# - http.cors.allow-methods=OPTIONS, HEAD, GET, POST, PUT, DELETE
# - http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type, Content-Length
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- vibhuviesdata:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
kibana:
image: docker.elastic.co/kibana/kibana:7.3.1
container_name: kibana
environment:
SERVER_NAME: 127.0.0.1
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
# XPACK_GRAPH_ENABLED: false
# XPACK_ML_ENABLED: false
# XPACK_REPORTING_ENABLED: false
# XPACK_SECURITY_ENABLED: false
# XPACK_WATCHER_ENABLED: false
ports:
- "5601:5601"
depends_on:
- elasticsearch
restart: "unless-stopped"
redis:
image: 'bitnami/redis:latest'
ports:
- 6379:6379
environment:
- ALLOW_EMPTY_PASSWORD=yes
volumes:
grafana-volume:
prometheus-volume:
postgres-volume:
vibhuviesdata:
driver: local
OBS: Note que os caminhos especificados no docker-compose refere-se aos nomes das pastas onde as aplicações estão armazenadas, abaixo detalho um pouco de cada comando.
- container_name: nome do container
- build: responsável por buildar e rodar nossa aplicação
- context: caminho referente a raiz do projeto
- dockerfile: arquivo para gerar imagem docker
- porta aplicação: porta onde aplicação ira rodar
ponteacesso:
container_name: ponte
build:
context: ../pontedeacesso
dockerfile: dockerfile
ports:
- '8080:8080'
depends_on:
- kafka
environment:
KAFKA_HOST: 172.18.0.1:9092
orquestrador:
container_name: orquestrador
build:
context: ../orquestrador
dockerfile: dockerfile
ports:
- '8081:8081'
depends_on:
- kafka
- elasticsearch
- mqseries
environment:
ELASTICSEARCH_HOST: 172.18.0.1:9200
KAFKA_HOST: 172.18.0.1:9092
MQ_HOST: tcp://172.18.0.1:61616
consumer:
container_name: consumerMq
build:
context: ../consumer
dockerfile: dockerfile
ports:
- '8082:8082'
depends_on:
- redis
- kafka
- mqseries
- postgres
environment:
POSTGRES_HOST: postgres
REDIS_HOST: "172.18.0.1"
REDIS_PORT: 6379
KAFKA_HOST: 172.18.01:9092
MQ_HOST: tcp://172.18.0.1:61616
Após isso e só rodarmos agora o comando docker compose up -d
que já teremos aplicação e ambiente rodando no docker e acessível pela maquina.
Observação: Por depender do elasticsearch nossa aplicação Orquestrador pode dar erro ao iniciar, caso isso aconteça e só inicializa-la dentro do console do docker após o elasticsearch ter subido.
Clique no botão Usuário
para acessar a tela de cadastro de usuário
Ao clicar no botão cadastrar já somos redirecionados para a tela que corresponde aos usuários cadastrados no Redis
que aguardam a confirmação do cadastro para serem salvos no Postgres
, esta tela pode ser acessada também clicando no botão Usuario Redis
- Logs da aplicação PonteAcesso dentro do container docker, mensagem produzida dentro do topico
Kafka
- Logs da aplicação Orquestrador dentro do container docker, mensagem recebida pelo consumer do topico Kafka, produzida para uma queue dentro do
RabbitMq
e salvo noElasticSearch
- Usuário salvo no elasticsearch visualizado atraves do
Kibana
- Logs da aplicação ConsumerMq dentro do container docker`
- Tela Usuários salvos no banco de memoria Redis`
- Usuário Salvo no Postgres após clicar no botão
Aceitar
Deixo aqui o link do repositório no github de toda a aplicação
Repositório completo
Finalizamos nossa brincadeira pelo mundo dos Microservices conhecendo um pouco mais sobre tecnologias e ferramentas fantásticas, agradeço a todos e quem curtiu e quiser me adicionem nas redes sociais para trocarmos conhecimento.
Posted on March 3, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.