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)