Microservices, Docker e Tecnologias de Mensageria parte 5
Tags: javascript, react, docker, devops
Published: 2022-03-03 03:56:05

Ferramentas necessárias:
* [Docker](https://docs.docker.com/desktop/windows/install/#:~:text=%20Install%20Docker%20Desktop%20on%20Windows%20%F0%9F%94%97%20,to%20authorize%20the%20installer%20and%20proceed...%20More%20)
* [Node.js] (https://nodejs.org/en/download/)

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](https://github.com/2020nani/testeMicroservi-os)
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.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmr2tf9vl97yijqljqjx.png)
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.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ak5b3d8uhgbfzg8jzfkd.png)
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.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v3oegufkpfn9ppw1oln1.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pfksnms0vlegna55xhr2.png)
**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.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3lu7b687gzpdcelhir6v.png)
 
Tela Inicial do front
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zawe7gpi9zzjx45mapn2.png)

Clique no botão `Usuário` para acessar a tela de cadastro de usuário
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80gyd2782ssaux25wagv.png)
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`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/49kosm7p4a7ufhx244s5.png) 
* 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 no `ElasticSearch`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/24ul7yxl8sn0ryv8snvn.png)
* Usuário salvo no elasticsearch visualizado atraves do `Kibana`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuarhz3qbf95castqh1f.png)
* Logs da aplicação **ConsumerMq** dentro do container docker`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8qqwc6lqfgakii12dhcr.png) 
* Tela Usuários salvos no banco de memoria Redis`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nhsmwutu1sdwdscltemi.png)
* Usuário Salvo no Postgres após clicar no botão `Aceitar`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lu542b6oeu94n61adh2j.png)

Deixo aqui o link do repositório no github de toda a aplicação
[Repositório completo](https://github.com/2020nani/testeMicroservi-os)
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. 

[linkedin](https://www.linkedin.com/in/nanialmeida/)
[github](https://github.com/2020nani)