Home | Escopo | Processo | Design/Mockups | Gerência | Estudos | Arquitetura | Contratos | BD | Qualidade | Configuração | Instalação | Instruções | Utilização | Analytics | Infraestrutura | Dicas |
---|
Arquitetura da Aplicação
Descrição
Nesta seção, detalhamos a arquitetura da aplicação, abordando as tecnologias utilizadas, o fluxo de deploy e a estrutura dos componentes. Além disso, descrevemos as metodologias de desenvolvimento adotadas, que visam garantir a qualidade e a eficiência no ciclo de vida do software.
Sumário
- Definição das Tecnologias
- Diagrama de Componentes
- Diagrama de Deploy
- Metodologias de Desenvolvimento
- Arquitetura & Deploy
Definição das Tecnologias
Backend
- Linguagem: JavaScript + TypeScript
- Ambiente de execução: Node.js
- Framework para API: Nest.js
- Banco de dados: PostgreSQL
- Interface de persistência: Prisma ORM
- Documentação da API: Swagger
- Testes: Jest
- Containerização: Docker + Docker Compose
Frontend
- Linguagem: JavaScript + TypeScript
- Ambiente de execução: Node.js
- Framework: Next.js
- Estilização: Tailwind CSS
- Gerenciamento de requisições HTTP: Axios
- Testes: Jest
Diagrama de Componentes
O diagrama de componentes abaixo ilustra a estrutura principal da aplicação, evidenciando a interação entre os componentes do frontend e backend.
Frontend:
O frontend é composto por dois módulos principais:
- App: Representa as telas que compõem a interface do usuário, onde ocorrem as interações.
- Components: São partes reutilizáveis da interface, como botões e formulários, que podem ser incorporados em diferentes telas.
Backend:
No backend, seguindo o padrão modular do Nest.js, os subcomponentes são divididos de acordo com responsabilidades específicas, facilitando a escalabilidade e manutenção da aplicação. Estes módulos lidam com autenticação, comunicação com o banco de dados, lógica de negócios, entre outras funções críticas.
Diagrama de Deploy
O diagrama de deploy a seguir detalha o processo automatizado de entrega contínua da aplicação. Cada vez que um commit é enviado para a branch principal (Main), são acionadas várias etapas de verificação e validação, incluindo:
- Linting: Verificação de boas práticas e padrões de código.
- Testes Unitários: Execução de testes automatizados para garantir a integridade das funcionalidades.
- Deploy: Após as validações, o código é automaticamente enviado e implantado em instâncias da AWS.
Infraestrutura:
- Frontend e Backend: Ambos são executados dentro de containers no mesmo EC2, garantindo consistência e isolamento de ambiente.
- Banco de dados: O PostgreSQL também está em execução na AWS, comunicando-se diretamente com o backend para garantir a persistência dos dados.
Essa automação garante que as atualizações do código sejam rapidamente entregues ao ambiente de produção, assegurando que a aplicação esteja sempre com a versão mais recente disponível para os usuários.
Metodologias de Desenvolvimento
Backend - BDD e DDD
BDD (Behavior-Driven Development)
O BDD é uma metodologia que expande o TDD (Test-Driven Development) ao focar no comportamento do sistema do ponto de vista do usuário. Essa abordagem permite uma comunicação clara entre as partes interessadas e a equipe de desenvolvimento, utilizando uma linguagem comum, acessível para todos os envolvidos.
-
Formato típico: Os cenários em BDD seguem o formato "Dado que... Quando... Então...", onde:
- Dado que: Define o estado inicial do sistema.
- Quando: Descreve a ação do usuário.
- Então: Especifica o resultado esperado.
Isso garante que o software seja desenvolvido de acordo com os requisitos funcionais e focado nas necessidades reais dos usuários.
DDD (Domain-Driven Design)
O DDD foca na modelagem do domínio de negócios, estabelecendo uma linguagem comum entre os desenvolvedores e especialistas do domínio. A estrutura do software é baseada no entendimento profundo das regras e processos do negócio.
Principais conceitos do DDD:
- Entidades: Objetos com identidade única.
- Agregados: Conjuntos de entidades que formam uma unidade lógica.
- Serviços de Domínio: Funcionalidades que não pertencem diretamente a uma entidade.
- Repositórios: Interfaces que lidam com o armazenamento e recuperação de entidades.
- Value Objects: Objetos que são definidos apenas por seus atributos.
Essa metodologia permite que o software evolua de forma orgânica, acompanhando as mudanças no domínio de negócio.
Frontend - MVC
MVC (Model-View-Controller)
A arquitetura MVC separa a aplicação em três partes principais, facilitando o desenvolvimento e a manutenção do código:
- Model: Gerencia os dados e a lógica de negócios da aplicação. No frontend, isso pode incluir hooks, estados e manipulação de dados da API.
- View: Define a interface visual da aplicação, utilizando componentes React estilizados com Tailwind CSS para garantir uma experiência de usuário consistente e responsiva.
- Controller: Atua como intermediário, lidando com as interações do usuário e as respostas da API, implementado no Next.js através de rotas e controladores.
Essa abordagem garante uma clara separação de responsabilidades, tornando a aplicação mais modular e fácil de escalar.
Arquitetura & Deploy
Resumo do Projeto: A arquitetura de infraestrutura foi projetada para suportar de forma robusta o ciclo de vida de desenvolvimento e deploy contínuo das aplicações. A solução utiliza um conjunto de tecnologias e boas práticas que garantem escalabilidade, segurança e automação a fim de prover escalabilidade para a PoC desenvolvida.
Componentes Principais da Infraestrutura:
Infraestrutura AWS EC2 (Região US East 2 - Ohio):
- Instâncias EC2 (CP-Planta1 e CP-Planta2): São instâncias de classe t2.medium que hospedam o ambiente de produção. Elas fazem parte de um grupo de segurança e de uma sub-rede gerenciada na região de Ohio.
- Grupo de Segurança e Sub-rede: Controlam o tráfego e garantem o isolamento e a segurança da infraestrutura.
Orquestração com Docker Swarm:
- Docker Swarm é utilizado para gerenciar e orquestrar os contêineres, oferecendo alta disponibilidade e escalabilidade automática.
- Os serviços principais incluem um backend desenvolvido com Nest.js, um frontend em Next.js, e um banco de dados PostgreSQL.
- Além disso, possuímos um banco de dados configurado com uma instância principal e uma réplica, proporcionando alta disponibilidade e resiliência. A réplica permite que o ambiente continue operando, mesmo em caso de falhas na instância principal, além de melhorar o desempenho distribuindo leituras entre as instâncias.
- O PgBouncer é utilizado como um serviço de pool de conexões, otimizando o uso dos recursos do banco de dados. Ele gerencia as conexões dos aplicativos ao serviço PostgreSQL primário, reduzindo a carga no banco e melhorando a eficiência das operações de leitura e escrita.
Automação e Gerenciamento com Ansible:
- Ansible é responsável pela configuração inicial das instâncias e pela orquestração do deploy. Ele automatiza a instalação de dependências, inicialização do cluster Swarm, e o deploy de novos serviços.
Pipeline de CI/CD:
O pipeline CI/CD é composto por dois conjuntos trabalhos principais:
- JOB 1: Testa padrões de commit, roda o processo de linting para averiguar formatação, roda os teste que forem definidos, atualiza as imagens Docker com novas alterações de código a partir do GitLab CI e por fim, aciona o trigger para o JOB 2.
- JOB 2: Aciona o deploy das novas imagens nas instâncias EC2 através do Ansible, garantindo que o ambiente esteja sempre atualizado com a última versão validada.
Destaques da Arquitetura:
- Automação de Ponta a Ponta: A integração entre Ansible, Docker Swarm e o pipeline de CI/CD elimina a necessidade de intervenções manuais, aumentando a eficiência do processo de deploy.
- Escalabilidade e Resiliência: A utilização de Docker Swarm permite escalonar automaticamente os serviços, enquanto a infraestrutura na AWS garante alta disponibilidade.
- Segurança e Controle de Acesso: A combinação de sub-redes e grupos de segurança assegura que o tráfego seja corretamente roteado e protegido.