03 - Estudo de Microsserviços ingresso.x - Monorepo e Docker
Tags: braziliandevs, monorepo, systemdesign, microservices
Published: 2023-08-26 20:12:25

### :unlock: Esse artigo é o terceiro de uma sequência de estudo em andamento.

[![github](https://img.shields.io/badge/Repositório%20do%20estudo-github-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/jtonynet/cine-ticket-study-microsservices) [![linkedin](https://img.shields.io/badge/Acesse%20o%20meu-linkedin-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/jos%C3%A9-r-99896a39/) [![twitter](https://img.shields.io/badge/Acesse%20o%20meu-twitter-1D9BF0?style=for-the-badge&logo=twitter&logoColor=white)](https://twitter.com/aromademirtilo) [![Instagram](https://img.shields.io/badge/Acesse%20o%20meu-Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white)](https://www.instagram.com/learningenuity/) ![Badge Status](https://img.shields.io/badge/STATUS-EM_DESENVOLVIMENTO-green?style=for-the-badge)

---

> **Padronização**
> _Padronização, normalização, normatização ou estandardização é o processo de desenvolvimento e implementação de normas técnicas. A padronização tem como objetivo definir especificações técnicas que auxiliem na maximização da compatibilidade, reprodutibilidade, segurança ou qualidade de determinado processo, produto ou serviço._
>
> _Fonte: [Wikipédia](https://pt.wikipedia.org/wiki/Padroniza%C3%A7%C3%A3o)_

O texto abaixo é referente à branch [feature/initial-main-000](https://github.com/jtonynet/cine-ticket-study-microsservices/tree/feature/initial-main-000) do repositório de estudo.

---

## :compass: Orientação
O desenvolvimento de software é cercado de ritos, formações inteiras são criadas com o objetivo de dar assertividade ao planejamento; passando pelo defasado "Waterfall" até o "[Desenvolvimento Ágil e Limpo](https://www.amazon.com.br/Desenvolvimento-%C3%A1gil-limpo-volta-origens/dp/8550815004)". Os ritos iniciais devem criar linhas gerais de desenvolvimento, as guidelines.
                                      
Cada microsserviço pode ser escrito de um jeito, torna-se tentador novos serviços serem criados com a "big next thing". Devs entusiasmados podem subestimar trade-offs para adotar tecnologias emergentes diferentes das linhas gerais. Damos a isso o nome de "dispersão técnica". Cultive esse entusiasmo, mas não permita que ele aumente desordenadamente sua dispersão técnica

Não estou dizendo para criar softwares sempre com _${qualquer_tecnologia_antiga}_. Mas devemos introduzir aos poucos novas tecnologias ao que foi previamente acordado nas guidelines. Elas levam a padronização o que reduz a dispersão técnica. Devemos ter foco.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcjxmgyihljn95yevk33.gif)

---

## :ring: Um Para a Todos Dominar

Em projetos é comum clonar e levantar um a um repositórios git para desenvolver. Isso pode ser uma dor de cabeça  multiplicada pelas tecnologias, versões e configurações.

Ciclos de Desenvolvimento, Processos de Implantação e a Introdução e Descontinuação devem ser estáveis, padronizados. Isso leva a estabilidade, primeiro princípio da **disponibilidade**. Rodar o projeto deveria ser tão simples quanto o possível, no nosso caso podemos instalar o `docker` e o `docker compose` responsável por levantar todas as imagens necessárias para rodar local  

[![Docker](https://img.shields.io/badge/Instale%20o%20-docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)](https://docs.docker.com/engine/install/)

[![Docker](https://img.shields.io/badge/Instale%20o%20-docker%20compose-2496ED?style=for-the-badge&logo=docker&logoColor=white)](https://docs.docker.com/compose/install/)

Após o docker e o docker compose instalados encontre o arquivo `./packages/cine-ticket-front-site/.sample_env` e crie uma copia dele com o nome de `.env`.

Arquivos `.env` devem estar no `gitignore` e por segurança nunca são comitados nos repositórios de código, para que não existam vazamento de dados.

então na raiz do projeto, digite o seguinte comando:

```bash
$ docker compose up --build
```

Deve demorar alguns minutos até que as imagens dos `dockerfiles` sejam construídas. Ao término do processo, acesse o endereço `http://localhost:8080` e teremos a página inicial, o front-end de nosso projeto:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8y3zxg1yl7htludahau.png)
_Projeto inicial rodando local após docker instalado._

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1go1v95yh3w3s9kk4wez.gif)

_Um repositório para todos dominar!_ Um gerenciador para auxiliar nessa tarefa. São nossas guidelines, nosso padrão de desenvolvimento. Analisemos a estrutura de pastas atual da raiz do projeto (tag v0.0.0):


```shell
  $ tree
  .
  ├── .vscode
  ├── docs
  |    ├── icons
  |    ├── logo.png
  |    └── project.png
  └── packages
  |    ├── cine-ticket-front-site
  |    └── cine-ticket-nginx
  ├── .dockerignore
  ├── .eslintignore
  ├── .eslintrc.json
  ├── .gitignore
  ├── .prettierignore
  ├── .prettierrc
  ├── docker-compose.yml
  ├── jest.config.ts
  ├── jest.preset.js
  ├── nx.json
  ├── package-lock.json
  ├── package.json
  ├── README.md
  └── tsconfig.base.json

```

Trata-se de um monorepo que iremos evoluir, nele se concentrarão nossos microsserviços, imagens de infra e suporte como bancos, caches, storages, filas, etc...

Observe dentro da pasta `packages` os diretórios `cine-ticket-front-site` e `cine-ticket-nginx`, são as aplicações que estão servindo a página `localhost:8080`. No mesmo nível de `packages` encontra-se o arquivo `docker-compose.yml`, que faz tudo acontecer, vamos esmiuçá-lo a seguir:


```yaml
version: '3.7'
services:
  cine-ticket-nginx:
    build:
      context: ./packages/cine-ticket-nginx
      dockerfile: Dockerfile
    ports:
      - 8080:80
    depends_on:
      - cine-ticket-front-site
    networks:
      - cine-ticket-network

  cine-ticket-front-site:
    build:
      context: ./packages/cine-ticket-front-site
      dockerfile: Dockerfile
    ports:
      - 3080:3000
    volumes:
      - ./packages/cine-ticket-front-site/src:/usr/src/app/src
      - ./packages/cine-ticket-front-site/dist:/usr/src/app/dist
    env_file: ./packages/cine-ticket-front-site/.env
    command: npm run start:dev
    tty: true
    networks:
      - cine-ticket-network

networks:
  cine-ticket-network:
```

Nosso `dockerfile.yml` define os serviços de:
1. **cine-ticket-nginx:**
    - build:
       - context: constrói a imagem a partir do diretório `./packages/cine-ticket-nginx`
       - dockerfile: Usa um arquivo `Dockerfile` que se encontra no diretório do context para dar as instruções de como montar a `imagem`.
    - ports: Mapeia as solicitações na porta `8080` da máquina hospedeira para porta `80` para da imagem
    - depends_on: O serviço `cine-ticket-front-site` precisa estar de Pé, "up and running" antes que esse serviço esteja funcional
    - networks: Rede na qual esta imagem vai estar integrada, para que tenhamos comunicação adequada no que podemos chamar de "por debaixo do capô" deve ser na mesma rede de sua dependência

2. **cine-ticket-front-site:**
    - build:
       - context: constrói o container a partir do diretório `./packages/cine-ticket-front-site`
       - dockerfile: Usa um arquivo `Dockerfile` que se encontra no diretório do context para dar as instruções de como montar o `contêiner`.
    - ports: Mapeia as solicitações na porta `3080` da máquina hospedeira para porta `3000` do contêiner
    - volumes:
       - Mapeia de maneira a sincronizar diretórios entre a máquina hospedeira e o contêiner `hospedeira:contêiner`, útil para hot-reload (esse caso em especifico) e persistência de dados.
      - `./packages/cine-ticket-front-site/src:/usr/src/app/src`
      - `./packages/cine-ticket-front-site/dist:/usr/src/app/dist`
      - env_file: Define arquivo para injetar variáveis de ambiente para o container.
      - command: comando que será executado quando o contêiner for iniciado a partir da imagem Docker
      - tty:  Permite que você veja a saída interativa e do container.
 - networks: Rede

3. **networks**: Define a rede `cine-ticket-network`
<br/><br/>

Outro arquivo interessante para nossa jornada é o `./packages/cine-ticket-nginx/conf/nginx.conf`

```json
events {
    worker_connections  4096;  ## Default: 1024
}

http {
  server {
    listen 80;
    
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      proxy_pass http://cine-ticket-front-site:3000;

      proxy_set_header Host $host;
      proxy_set_header X-NginX-Proxy true;
      proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}
```

Ele define nosso proxy reverso. Um intermediário, melhorando o desempenho e a segurança, encaminhando solicitações para o serviço `cine-ticket-front-site:3000` e manipulando os cabeçalhos para a comunicação correta entre os componentes.

vamos considerar para fins didáticos que apenas as requisições servidas pelo [NGINX](https://www.nginx.com/) são públicas e o restante estão debaixo da rede `cine-ticket-network`, nossa "nuvem local" que vai possuir microsserviços privados.

---

## :nerd\_face: Conclusão (por hora)

Vimos que padronização garante estabilidade reduzindo dispersão técnica, baixamos o docker e o docker compose e entendemos como as partes do nosso monorepo interagem entre si.

Adotaremos como padrão de desenvolvimento muitos dos conceitos apresentados nesse artigo para nossos futuros microsserviços.

Mantenha o entusiasmo mas reduza o quanto puder a dispersão técnica.

Utilizamos **Monorepo e Docker** para alcançar nossos  objetivos.

---

## :footprints: Próximos passos

Vamos finalmente iniciar a codar nosso primeiro Microsserviço de Catálogo, a partir de diagramas propostos e com guidelines claras e objetivas que apenas boas documentações garantem.

Até breve.

---


| :point_left: Anterior | Próximo :point_right: |
|-----------------|----------------|
| [Alguns Desafios](https://dev.to/learningenuity/02-estudo-de-microsservicos-ingressosx-desafios-2f35) | [Microsserviço de Catálogo](https://dev.to/learningenuity/04-estudo-de-microsservicos-ingressosx-microsservico-de-catalogo-17ed) |