Microservices, Docker e Tecnologias de Mensageria parte 5

2020nani

Hernani Almeida

Posted on March 3, 2022

Microservices, Docker e Tecnologias de Mensageria parte 5

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"]
Enter fullscreen mode Exit fullscreen mode

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
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
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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Image description
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

Tela Inicial do front
Image description

Clique no botão Usuário para acessar a tela de cadastro de usuário
Image description
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
  • 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
  • Usuário salvo no elasticsearch visualizado atraves do Kibana Image description
  • Logs da aplicação ConsumerMq dentro do container docker` Image description
  • Tela Usuários salvos no banco de memoria Redis` Image description
  • Usuário Salvo no Postgres após clicar no botão Aceitar Image description

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.

linkedin
github

💖 💪 🙅 🚩
2020nani
Hernani Almeida

Posted on March 3, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related