microservices

Table of Contents


Há um tempo eu desejava entender melhor como os tão famosos microsserviços conseguem trabalhar individualmente, porém todos conectados. Foi então que decidi projetar uma pequena aplicação onde iria me aprofundar nesses conhecimentos, e que também me desafiaria a criar uma aplicação completa seguindo o Software Development Life Circle. Partindo desde a criação da ideia, até o deploy.

Isso pode ser representado conforme o seguinte fluxo:

img1

Então, meu nome é Patrick Berlatto Piccini, e esse é meu projeto completo de microservices.

Entendimento do problema

Nesse projeto, utilizarei algumas ferramentas contidas na OCI (Oracle Claud Infraestructure) visto que, recentemente (Fevereiro 2022) passei na certificação "Oracle Cloud Infrastructure Foundations 2021 Associate". Se você desejar seguir os passos da criação da aplicação e desenvolver junto comigo o código, é opcional utilizar o OCI.

Vamos começar…

Objetivo

Criar duas aplicações básicas de microsserviços:

O primeiro deles deverá ser um cadastro de usuários, contendo as seguintes informações:

  • create_user, show_all_user, show_one_user, edit_user, edit_password e delete_user

Tabela de usuários "users" deverá conter os campos: user_id, nick_name, full_name, password, cpf, email, phone_number, created_at, updated_at.

O segundo será um serviço de OS (ordem de serviço) que deverá conter no cadastro, o user_id do usuário contido no banco de dados. Deverá ter as seguintes informações:

  • order_id, user_id, item_description, item_quantity, item_price, total_value, created_at, updated_at.

A arquitetura da aplicação será a seguinte: criaremos uma API que será responsável por distribuir as requisições através de um broker de mensagens chamado RabbitMQ, e também criar as filas e tabelas necessárias para a aplicação.

Nesse broker, terão duas filas onde a API fará a separação das mensagens e enviará ao seu devido destino, onde teremos dois microsserviços, uma para usuários, e outro para os orders. Cada microsserviço é conectado a um banco de dados Postgres onde serão armazenadas as informações dos usuários e dos orders.

Juntamente a API, haverá uma camada de memória cache onde utilizaremos o Redis para fazer essa função. Então, caso uma requisição já tenha sido feita, a API irá verificar antes nos dados em Cache se já existe essa informação. Assim, o usuário terá o retorno muito mais rápido.

img2

Arquitetura do Projeto Completo

MS-application
│   .gitignore
│   docker-compose-services.yml
│
├───API
│   │   docker-compose-api.yml
│   │   Dockerfile
│   │   requirements.txt
│   │   server.py
│   │
│   ├───config
│   │       database_connection.py
│   │       rabbitmq_connection.py
│   │       redis_connection.py
│   │       __init__.py
│   │
│   └───rabbitmq_controller
│           rabbit_queues.py
│           __init__.py
│
├───MS1
│   │   docker-compose-microservice1.yml
│   │   Dockerfile
│   │   main.py
│   │   requirements.txt
│   │
│   ├───config
│   │       database_connection.py
│   │       rabbitmq_connection.py
│   │       __init__.py
│   │
│   ├───criptografy
│   │       hash_password.py
│   │       __init__.py
│   │
│   ├───database_controller
│   │       postgres_worker.py
│   │       __init__.py
│   │
│   └───rabbitmq_controller
│           rabbit_worker.py
│			__init__.py
│
└───MS2
    │   docker-compose-microservice2.yml
    │   Dockerfile
    │   main.py
    │   requirements.txt
    │
    ├───config
    │       database_connection.py
    │       rabbitmq_connection.py
    │       __init__.py
    │
    ├───database_controller
    │       postgres_worker.py
    │       __init__.py
    │
    └───rabbitmq_controller
            rabbit_worker.py
            __init__.py