microservices

Table of Contents


Findando o nosso projeto, precisaremos ainda aplicar a camada de cache em todas as rotas que nos retornam alguma informação vinda do banco de dados. Como estamos usando o Flask em nossa aplicação, existe uma extensão de cache próprio da biblioteca chamada Flask-Caching. Flask-Caching é uma extensão do Flask que adiciona suporte de cache para vários back-ends a qualquer aplicativo Flask. Ao ser executado em cima do cachelib , ele suporta todos os back-ends de cache originais do werkzeug por meio de uma API uniforme. Também é possível desenvolver seu próprio backend de armazenamento em cache por meio de subclasses de flask_caching.backends.base.BaseCache classe, mas isso não vem ao caso nessa aplicação.

[Flask-Caching - https://flask-caching.readthedocs.io/en/latest/]

Instalação

Antes de qualquer coisa, certifique-se de ter instalado todos os módulos contidos no arquivo requirements.txt da API.

   psycopg2-binary
   Flask-Caching
   threaded
   flask
   redis
   pika
   uuid

Comando para instalação:

pip install -r requeriments.txt

Primeiramente iremos fazer o import da biblioteca Cache que iremos utilizar no arquivo server.py.

from flask import Flask, request
from flask_caching import Cache  # Import Cache from flask_caching module
from config.database_connection import ConnectionDatabase
...

Inicialização do Redis

Dentro da classe Api_server, apontaremos a conexão com o servidor Redis, visto que já configuramos todas as informações no arquivo redis_connection.py no Step5, precisaremos chama-las no arquivo da API.

    app = Flask(__name__)
    app.config.from_object('config.redis_connection.BaseConfig')
    cache = Cache(app)  # Initialize Cache

    ConnectionDatabase()
    rabbit_queues.create_queues()

Decorator Cached

Nas rotas que serão retornadas alguma informação da banco de dados iremos colocar um novo decorator. Para armazenar funções em cache, usaremos o comando cached. Por parâmetro, haverá a opção timeout, que será o responsável por manter o cache por determinado tempo, que no nosso caso, será 30 segundos.

@app.route("/user/show_all_user/", methods=['GET'])
@cache.cached(timeout=30, query_string=True) ##CACHE
def list_user():
...

@app.route("/user/show_one_user/", methods=['POST'])
@cache.cached(timeout=30, query_string=True) ##CACHE
def show_user():
...

@app.route("/order/list_all_orders/", methods=['GET'])
@cache.cached(timeout=30, query_string=True) ##CACHE
def list_order():
...

@app.route("/order/list_per_users/", methods=['GET'])
@cache.cached(timeout=30, query_string=True) ##CACHE
def list_per_users():

Exemplo

Fazendo um teste, o ganho é significativo, chegando até ser 20x mais rápido do que uma consulta padrão do postgres.

img36

Microservice Project – Finalização

Então, chegamos ao fim desse projeto.

Durante o desenvolvimento do código, me esbarrei em diversos erros e problemas que pareciam não ter mais sentido, principalmente nas partes onde precisava fazer algum teste no ambiente da OCI. Como ainda estava aprendendo algumas coisas novas sobre a criação de aplicação em nuvem, passei por problemas essenciais para aprender e entender como devo arquitetar todo um local de produção. Também aprendi diversas coisas sobre persistência de dados, e como trabalhar com as manipulações das informações disponibilizadas pelo usuário. Sobre Docker, aprendi muito como criar Docker-Compose, visto que é extremamente importante saber isso para criação de containers rapidamente, e pude ver um pouco mais sobre Dockerfile, e buildar minhas próprias imagens, de acordo com a necessidade da aplicação. Pude me aprofundar na criação e gerenciamento do broker de mensagem utilizando Rabbit, e em como criar uma estrutura complexa utilizando o conceito RPC(Remote Procedure Call), para o retorno de informações ao requisitor, que no nosso caso é o usuário. Com todos esses aprendizados pude concluir o objetivo final que era criar microsserviços independentes e caso algum deles pare de funcionar, não cause indisponibilidade a todo a aplicação.

Uma coisa que deixei de fazer nesse projeto, mas que pretendo abordar em outro momento, é a criação de testes unitários, visto que isso é um requisito quase obrigatório no mercado de trabalho dos desenvolvedores. Então, podemos riscar de nosso fluxo de desenvolvimento essa etapa.

img37

Espero que tenha aproveitado todo o desenvolvimento do projeto, e que sua leitura tenha agregado conhecimentos.