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.
Top comments (0)