Documento de Arquitetura - estudeplus/docs GitHub Wiki

Histórico de Versão

Versão Descrição Responsáveis
0.1 Criação e formatação do documento Victor Gomide
0.1 Metas e Restrições de Arquitetura Diego Resende
0.2 Visão de Casos de Uso Érico Bandeira e Max Henrique
0.1 Visão Lógica Matheus Batista e Emanoel Belchior
0.1 Visão de Implantação Matheus Batista
0.1 Introdução e Representação da Arquitetura Victor Gomide
0.1 Visão de implantação e padrões arquiteturais Matheus Batista e Emanoel Belchior
0.1 Visão de implementação João Victor Lustosa Braz
0.2 Visão de dados Érico Bandeira, João Rosa e Max Henrique
0.1 Diagramas de sequência, componentes Matheus Batista e Emanoel Belchior

Sumário

  1. Introdução
  2. Representação da Arquitetura
  3. Metas e Restrições da Arquitetura
  4. Visão de Casos de Uso
  5. Visão Lógica
  6. Visão de Implantação
  7. Visão de Implementação
  8. Visão de Dados

Introdução

Finalidade

Este documento busca deixar claras todas as decisões tomadas em relação à arquitetura do sistema, de forma abrangente e por vários pontos de vista.

Escopo

O sistema em questão é o Estude+, aplicação web criada por estudantes da UnB-FGA com o intuito de facilitar a comunicação e organização entre monitores e alunos.

Definições, Acrônimos e Abreviações

  • UnB: Universidade de Brasília;
  • FGA: Campus Gama da UnB;
  • UML: Unified Modeling Language, linguagem visual muito utilizada principalmente na área de desenvolvimento de software para modelar sistemas e facilitar o entendimento da equipe e do cliente;
  • MER: Modelo Entidade-Relacionamento, modelo geralmente utilizado para representar classes e como se relacionam em um banco de dados;

Referências

Representação da Arquitetura

Este documento apresenta a arquitetura como uma série de visualizações: visão de casos de uso, visão lógica, visão de implantação, visão de implementação e visão de dados. Elas são visualizações em um modelo UML.

Metas e Restrições da Arquitetura

Metas

A meta arquitetural do projeto tem como o objetivo o desacoplamentos do sistema em principais microsserviços. Facilitando o desenvolvimento do sistema na construção de serviços de forma independente e que possam ser feitas ao mesmo tempo. Há a facilidade do uso de diferentes tecnologias que melhor se adeque em cada serviço.

Restrições

O sistema será desenvolvido para ser suportado pelos principais navegadores, como Chrome, Opera e Firefox. Para o desenvolvimento será utilizadas algumas tecnologias:

  • Python: Plataforma de desenvolvimento base utilizada em alguns microsserviços.
  • JavaScript: Plataforma de desenvolvimento base utilizada em alguns microsserviços.
  • Django: framework para o desenvolvimento de aplicações webs.
  • Django Rest: Biblioteca usada no Django para implementação de API’s Rest.
  • ReactJS: Biblioteca usada com o JavaScript para a criação de interfaces de usuários.
  • Materialize: Framework css baseado nas características do Material Design.

Visão de Casos de Uso

Uma descrição da visão de casos de uso da arquitetura de software. A Visão de Caso de Uso é uma introdução importante para a seleção do conjunto de cenários e/ou casos de uso que são o foco de uma ou mais iteração. Ela descreve o conjunto de cenários e/ou os casos de uso que representam alguma funcionalidade central e significativa a aplicação descrita. Também descreve o conjunto de cenários e/ou casos de uso que possuem cobertura arquitetural substancial (que exercita vários elementos de arquitetura) ou que enfatizam ou ilustram um determinado ponto complicado da arquitetura.

Os casos de uso do Estude+ são:

  • Pré Cadastrar
  • Se Cadastrar
  • Gerenciar Perfil
  • Efetuar Login
  • Ver Lista de Turmas das Disciplinas
  • Se Inscrever em uma Turma
  • Gerar Notificações sobre Monitorias
  • Criar Evento Monitoria
  • Editar Evento Monitoria
  • Cancelar Evento Monitoria

Esses casos de uso são iniciados pelos agentes estudante e monitor. Além disso, ocorre a interação com agentes externos: Sistema.

Casos de Uso Significativos para a Arquitetura

Pré Cadastrar

Esse caso de uso serve para que o sistema avalie se a matrícula informada pelo usuário do sistema é de um estudante ou não.

Cadastrar Usuário

Esse caso de uso serve para que o usuário se cadastre como estudante da aplicação. Caso seja monitor, este em algum momento (ao sair da lista de monitores), receberá um email para alterar suas permissões na aplicação.

Gerenciar Perfil

Caso de uso onde o usuário da aplicação, independente de ser monitor ou estudante, pode alterar dados sobre o seu perfil, como avatar, nome, email e senha.

Efetuar Login

Através das credenciais utilizadas para se cadastrar o usuário, independente de ser monitor ou estudante, pode entrar na aplicação.

Ver Lista de Turmas das Disciplinas

Esse caso de uso serve para que o usuário, estudante, possa ver as turmas das disciplinas que estão disponíveis no sistema.

Se Inscrever em Turma

Caso de uso atribuída ao estudante, que poderá se inscrever na turma que gostaria de receber notificações sobre monitorias.

Gerar Notificações sobre Monitorias

O sistema vai gerar ao estudante notificações a respeito de criação, edição ou cancelamento de monitorias cujo as quais ele se inscreveu.

Criar Evento Monitoria

Caso de uso em que o usuário monitor poderá criar um evento para a realização de sua monitoria, especificando horário, data, local e assunto.

Editar Evento Monitoria

Caso de uso em que o usuário monitor que criou determinado evento de monitoria possa alterar informações sobre este evento.

Cancelar Evento Monitoria

Caso de uso em que o usuário monitor deseja cancelar alguma monitoria na qual ele a tenha criado.

Visão Lógica

Visão geral

Diagrama de pacotes

Diagrama de componentes

Camada de apresentação

Na camada de apresentação foi utilizada a tecnologia React, que segue uma arquitetura orientada a componentes. Os principais componentes são:

  • Cadastro
  • Home
  • Navbar-Perfil
  • Navbar
  • Perfil
  • Pré-cadastro

Uma visão mais detalhada sobre sua implementação pode ser encontrada na seção de Visão de implementação.

API Gateway

A API gateway é responsável por servir como entry point para a interface consumir os serviços que compõem a camada negocial. Esse serviço foi implementado utilizando a tecnologia NodeJS, juntamente com o framework Express. Seus principais componentes são:

  • Gerencimento de autenticação
  • Proxy HTTP
  • Gerenciamento de Logs Mais detalhes sobre sua implementação pode ser encontrada na seção Visão de implementação.

Camadas de subdomínio

  • Gerencimento de perfil

  • Gerencimento de email

  • Gerencimento de evento de monitoria

  • Gerencimento de notificações

  • Gerencimento de disciplinas

  • Validação de monitor

  • Transformação de dados

  • Camada de dados do processo de monitoria

    • Um arquivo em formato CSV que consiste nos dados do processo de monitoria coletado durante a inscrição dos monitores

Visão de Implantação

Para realizar a implantação dos microserviços foi escolhida a estratégia de containers, dado sua habilidade de prover isolamento, controle de alocação de recursos, portabilidade e fluidez no deploy. Para implementar essa arquitetura de container foram utilizadas as ferramentas:

  • Docker - para realizar o empacotamento e execução
  • Kubernetes - para realizar a orquestração

Os microserviços são empacotados utilizando imagens Docker, essas imagens são versionadas no serviço Dockerhub.

Kubernetes

O Kubernetes foi escolhido por prover um conjunto de ferrametnas que facilita o deploy, integração, configuração, escalonamento e confiabilidade para os serviços.

O Kubernetes é uma ferramenta responsável por realizar a orquestração de containers bem como oferecer diversos componentes responsáveis por prover um conjunto de padrões arquiteturais.

Visão geral do Kubernetes

O Kubernetes funciona através da construção de clusters, precisando existir pelo menos um nó master e um slave.

Padrões arquiteturais

Plataform de deploy de serviço

A ferramenta Kubernetes implementa o padrão arquitetural: Plataform de deploy de serviço. Que de acordo com o Chris Richardson, é uma infraestrutura automatizada para deploy de aplicações. Provendo abstração de serviços através de namespaces, além de uma estrutura para oferecer alta confiabilidade(por exemplo load balance) para as instância dos serviços.

Serviço por container

Como já citado anteriormente os serviços são empacotados utilizando imagens Docker. A partir disso foi utilizado o componente Deployment do Kubernetes para criar uma estrutura de criação de containers, facilitando assim o deploy por demanda dos serviços. Nessa estrutura cada container é responsável por realizar a execução de somente um serviço. O padrão Serviço por container é uma especialização do padrão Serviço por Host.

Server-side discovery

Quando se utiliza o padrão Serviço por container, existe um problema de rotemento para os serviços criados, pois os clientes precisariam conhecer o endereço de IP de cada serviço, e como eles são criados dinâmicamente o problema se agrava.

Para resolver esse questão de roteamento, foi utilizado o componente Service do Kubernetes que atua como roteador para os containers conectados a ele. Cada Service possui um DNS fixo, onde os clientes que desejam consumir um determinado serviço fazem a requisição para o DNS do Service, e a partir disso o Service vai buscar todos os IPs dos containers registrados nele. Esse padrão é conhecido como Server-side discovery.

API Gateway

Quando se trabalha na arquitetura de microserviços os clientes de interface de usuário que consumem esses serviços acabam enfrentando um grande overhead para gerenciar o endereço de todos o serviços que precisam ser consumidos.

Para resolver essa questão foi utilizado o padrão API Gateway. Nesse padrão um serviço funciona como entry point para todas as requisições realizando um proxy para o serviço de destino. Pode-se observar que a API Gateway funciona como um Mediator a nível de serviço.

Database por serviço

A fim de manter a consistência de dados coerente em cada domínio dos microserviços foi aplicado o padrão Database por serviço. Cada microserviço possui uma base de dados própria diminuindo o acoplamento entre os serviços, oferencendo uma maior confiabilidade e capacidade de extensão, pois cada serviço pode utilizar uma tecnologia diferente na camada de persistência.

Saga

Para manter a consistência de dados em uma arquitetura de microservicos onde cada serviço tem seu próprio banco de dado e as transações abrangem varios serviços. Para isso é necessério um mecanismo que garanta a consistência dos dados. A técnica coreografia é uma forma de implementação do SAGA onde após cada transação local ocorre o envio de uma cadeia de eventos que acionam a consistência de dados em outros serviços.

Implementação do SAGA no Estude+

Diagrama de implantação

Segue o diagrama de implantação de todos os microserviços que compõem a solução Estude+. É importante observar que a camada Aplicaton Stack é composta por todos os componentes apresentados em na definição da arquitetura do Kubernetes. Ou seja cada Aplication Stack possui um Service para realizar o Server-side discovery e um Deployment para garantir o Serviço por container.

Visão de Implementação

O software está implantado e sendo executado através de contêineres que estão alocados em um só servidor. O computador do usuário é qualquer dispositivo capaz de executar um navegador da Web.

Diagrama de implementação

Diagrama de componentes da interface

Diagrama de classe da API Gateway

Diagrama de classe do serviço de Transformação de dados

Diagrama de classe da extração de dados

Diagrama de Sequência da API Gateway

Diagrama de Sequência da Validação de Monitor

Diagrama de colaboração do Evento de Monitoria

Criação de evento Monitoria

Visão de Dados

Atualmente existem 3 microserviços que possuem seu próprio banco de dados, sendo o de extração, o de perfil o postgresql e o de gerenciamento de autenticação usando o mongo db. O gerencimento de perfil armazena os dados proeminentes ao cadastro do aluno, sendo eles: Nome, Email, Matricula web e Senha. O serviço de extração de dados armazena dados vindo da relação que existe entre monitor e matérias.