microservices

Table of Contents


Nesse próximo passo, parto do pressuposto que meu ambiente já está configurado e com todas as instalações feitas, assim, posso começar a criar as primeiras linhas de código.

Devemos começar criando uma pasta chamada MS-Application. Essa pasta será onde iremos criar todos os microsserviços, configuração de containers de serviço, e mais alguns detalhes, que serão mostrados no decorrer das publicações.

Na raiz da pasta, criamos um arquivo chamado docker-compose-services.yml.

MS-Application
│   docker-compose-services.yml

Criação do Docker-Compose-Services

Como vamos usar containers para praticamente tudo, será necessário que os servidores Rabbit, Redis, Postgres, e interfaces de manager sejam criadas separadamente em seus devidos containers. É necessária essa separação para que nenhum servidor dependa do outro para funcionar. Com isso, já temos os primeiros passos na criação da arquitetura de microsserviços.

Para inicializar esses serviços rapidamente, iremos desenvolver um Docker-Compose e configuraremos uma Network, onde posteriormente estarão todos os serviços dentro dessa mesma rede.

A rede foi nomeada de internal-network, nela, iremos configurar o endereço 10.5.0.0 sendo uma rede classe A, com uma máscara de rede /16. Também iremos definir o gateway da rede para 10.5.0.1.

version: "3.7"
networks:
  network-service:
    driver: bridge
    name: internal-network
    ipam:
      config:
        - subnet: 10.5.0.0/16
          gateway: 10.5.0.1

Nos serviços, iniciamos configurando o RabbitMQ. Utilizaremos a imagem rabbitmq:3-management-alpine, que é uma imagem mínima do Docker baseada no Alpine Linux com um índice de pacotes completo e apenas 5 MB de tamanho. Nas variáveis de ambiente é deixado com o valor padrão o user, password e host, que será utilizado posteriormente para conectar ao manager do rabbit. Nas portas, devemos colocar 15672 para o manager e 5672 para o servidor. E por fim, iremos configurar o contêiner para ficar dentro da Network que foi criada anteriormente, apontando também um ip estático para essa instancia.

Alpine

services:
  rabbitmq:
    image: "rabbitmq:3-management-alpine"
    environment:
      RABBITMQ_DEFAULT_USER: "guest"
      RABBITMQ_DEFAULT_PASS: "guest"
      RABBITMQ_DEFAULT_VHOST: "/"
    ports:
      - "15672:15672"
      - "5672:5672"
    labels:
      NAME: "rabbitmq1"
    networks:
      network-service:
        ipv4_address: 10.5.0.10

A estrutura dos próximos serviços é bem semelhante a essa primeira, com apenas alguns detalhes como diferença. No Postgres, utilizaremos a imagem postgres:13, iremos indicar as variáveis padrões do user e password para conexão a instância, apontaremos a porta padrão 5432, criaremos um volume compartilhado de .data para /data/, configuraremosaNetwork com o ip estático, e um detalhe muito importante, será colocado o parâmetro restart: Always que fará com que a instância seja reiniciada caso pare de funcionar. Se for interrompido manualmente, ele será reiniciado somente quando o daemon do Docker for reiniciado ou o próprio contêiner for reiniciado manualmente.

  postgres:
    container_name: postgres_container
    image: postgres:13
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: baseapplication
    ports:
      - "5432:5432"
    volumes:
      - ./data:/data/
    networks:
      network-service:
        ipv4_address: 10.5.0.11

Para ter uma parte visual do banco de dados, faremos a criação de uma instância com o PgAdmin, que poderemos conectar ao servidor do postgres via Web. Sendo assim, iremos utilizar a imagem dpage/pgadmin4, com as variáveis de e-mail e password para entrarmos na página web. Iremos apontar a porta de 16543/80 (external/internal), compartilharemos os volumes./data/:/data/ e ./postgres-backup:/var/lib/postgresql/backups, iremos configurar a network com um ip estático, e colaremos uma dependência no parâmetro depends_on – postgres. Isso fará com o a instância do PgAdmin só seja criada, após a criação da instância do postgres.

  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@admin.com
      PGADMIN_DEFAULT_PASSWORD: admin
    ports:
      - "16543:80"
    depends_on:
      - postgres
    volumes:
      - ./data/:/data/
      - ./postgres-backup:/var/lib/postgresql/backups
    networks:
      network-service:
        ipv4_address: 10.5.0.12

E para camada de cache, iremos criar uma instância com Redis utilizando a imagem redis:alpine, apontando a porta padrão 6379, e configurando a Network com um ip estático.

  redis:
    image: redis:alpine
    container_name: redis-container
    ports:
      - "6379:6379"
    networks:
      network-service:
        ipv4_address: 10.5.0.9

No final, teremos vários containers rodando dentro de uma Rede, tendo algo parecido com a seguinte imagem:

img16

Teste na OCI

Agora que temos pronto o Docker-Compose com todos os serviços que utilizaremos, devemos fazer um teste dentro da VM que criamos na OCI. Para conseguir compartilhar o código, faço um git commit de minha pasta MS-Application, e dentro da instância OCI dou um git pull para baixar.

OBS: Não entrarei em detalhes nos comandos do git, caso tenha alguma dúvida especifica, consulte a documentação oficial: https://comandosgit.github.io/

Dentro a instância, inicio meus serviços com o comando docker-compose -f docker-compose-services.yml up, e passo o nome do arquivo que deverá ser iniciado.

Nesse momento começará a baixar as imagens dos contêineres.

img17

img18

img19

Agora que está tudo rodando, pude fazer um teste me conectando ao manager do RabbitMQ pela Web. Porém como a aplicação está em cloud, é necessário que nas configurações da VNC do projeto, sejam expostas as portas que iremos utilizar para nos conectar externamente.

img20

Na OCI, em Networking > Virtual Cloud Networks > sua_vnc > Security List Details > Ingress Rules. iremos adicionar as portas que utilizaremo

img21

img22

Após a liberação da porta, consegui ter acesso aos meus contêineres, tanto o do rabbit quando ao pgadmin, que também liberei a porta. Percebam que para me conectar aos meus contêineres, utilizo o ip public da VM que estou utilizando.

img23

img24

Resumo

Nesse Step, criamos o arquivo docker-compose-services.yml que é responsável por iniciar os servidores RabbitMQ, Postgres e Redis, juntamente as interfaces PgAdmin e RabbitManager. Foram liberadas as portas dos servidores para visualização externa, e também foi feito um teste acessando as interfaces externamente à OCI, tendo sucesso na conexão.