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
- Introdução
- Representação da Arquitetura
- Metas e Restrições da Arquitetura
- Visão de Casos de Uso
- Visão Lógica
- Visão de Implantação
- Visão de Implementação
- 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
- Microservices - Martin Fowler. Disponível em: https://martinfowler.com/articles/microservices.html. Acesso em: 23 de junho de 2019.
- A pattern language for microservices - Chris Richardson. Disponível em: https://microservices.io/patterns/index.html. Acesso em: 23 de junho de 2019.
- Deployment Diagrams Overview - UML Diagrams. Disponível em: https://www.uml-diagrams.org/deployment-diagrams-overview.html. Acesso em: 23 de junho de 2019.
- Kubernetes Documentation - Kubernetes. Disponível em: https://kubernetes.io/docs/home/. Acesso em: 23 de junho de 2019.
- CIn - Centro de Informática da UFPE - Exemplo: Documento de Arquitetura de Software. Disponível em: https://www.cin.ufpe.br/~gta/rup-vc/extend.formal_resources/guidances/examples/resources/sadoc_v1.htm. Acesso em: 24 de junho de 2019.
- GitHub - EPS/MDS - Kalkuli - Documento de Arquitetura. Disponível em: https://fga-eps-mds.github.io/2018.2-Kalkuli/docs/docArquitetura#4-vis%C3%A3o-de-implementac%C3%A3o. Acesso em: 24 de junho de 2019.
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 Sequência da API Gateway
Diagrama de Sequência da Validação de Monitor
Diagrama de colaboração do Evento de 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.