DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

Arquitetura Monolítica

Introdução

A Arquitetura Monolítica é um sistema único, não divido, que roda em um único processo, ou seja, é uma aplicação na qual diferentes componentes estão ligados em um único programa dentro de uma única plataforma.

Nessa arquitetura o núcleo do comportamento da aplicação é executado em seu próprio processo e a aplicação inteira é implantada como uma única unidade. Desse modo, todas as responsabilidades estruturais, como apresentação, lógica de negócio e a lógica de acesso a dados são separados por meio da criação de pastas no projeto.

Monolito

Dizem que os monolítos é a forma natural de desenvolver um software. Todo projeto começa com um monolito. O problema é quando o sistema cresce sem disciplina. O Monolito não é ruim por definição, mas tende a desagradar se o design interno não for controlado. Ele se torna um “spaghetti” quando as fronteiras lógicas desaparecem e as regras de negócios ficam espalhadas entre as pastas sem indicação calra entre a dependência entre as classes nas pastas.

Exemplo de Arquitetura Monolita

MyApp/
 ├── Controllers/             # Controladores MVC (lógica de entrada)
 │    ├── HomeController.cs
 │    ├── PedidoController.cs
 │    └── ClienteController.cs
 │
 ├── Models/                  # Modelos de domínio ou ViewModels
 │    ├── Pedido.cs
 │    ├── Cliente.cs
 │    └── Endereco.cs
 │
 ├── Views/                   # Páginas da aplicação (MVC Views)
 │    ├── Home/
 │    │    └── Index.cshtml
 │    ├── Pedido/
 │    │    ├── Index.cshtml
 │    │    └── Detalhes.cshtml
 │    └── Shared/
 │         ├── _Layout.cshtml
 │         └── _ViewImports.cshtml
 │
 ├── wwwroot/                 # Arquivos estáticos (CSS, JS, imagens)
 │    ├── css/
 │    ├── js/
 │    └── img/
 │
 ├── Data/                    # (Opcional) Acesso ao banco (DbContext, Migrations)
 │    ├── AppDbContext.cs
 │    └── Migrations/
 │
 ├── appsettings.json         # Configurações da aplicação
 ├── Program.cs               # Ponto de entrada da aplicação
 ├── Startup.cs (opcional)    # Configuração de serviços e pipeline (caso use)
 └── MyApp.csproj             # Arquivo do projeto

Enter fullscreen mode Exit fullscreen mode

Vantagens

  • Mais simples de desenvolver: A organização fica concentrado em um único sistema e muitos desenvolvedores estão familiarizados com este modelo, tendo um desenvolvimento inicial mais rápido
  • Simples de fazer deploy para o servidor: Fazemos o deploy em um único pacote final
  • Exige uma equipe menor: Necessita de um time menor para desenvolver e manter a aplicação

Desvantagens

  • Manutenção: A aplicação se torna cada vez maior de acordo com seu tamanho, o código será cada vez mais difícil de entender e o desafio de fazer alterações rápidas e ter que subir para o servidor só cresce
  • Alterações: Para cada alteração feita, é necessário realizar um novo deploy para toda a aplicação
  • Fragilidade: Uma linha de código que subiu errada pode quebrar todo o sistema e ele ficar totalmente inoperante

Evolução de Monolito

O problema de “spaghetti”, como já citado anteriormente é fruto de uma consquência de má modelagem e ausência de modulariade interna.

Um monolito bem estruturado, com separação interna de domínios, uso de padrões (CQRS, Mediator, DDD simplificado) e limites bem definidos pode ser limpo, testável e escalável internamente, sem precisar se dividir em microserviços.

Arquitetura Monolítica em camadas

Um exemplo comum e ótimo de utilizar é a separação lógica das responsabilidades em camadas.

Para isso as aplicações evoluem para soluções com vários projetos onde cada projeto reside em uma camada com responsabilidade específica. Então, podemos ter uma evolução em uma arquitetura monolítica de projeto único para uma arquitetura em camadas.

A diferença está aqui:

Tipo de monólito Características
Monólito desestruturado Tudo misturado, acoplado, sem limites.
Monólito modular Um único deploy, mas módulos independentes e bem isolados.

Top comments (0)