Principais tipos de arquitetura de software - Monólitos, serviços e microsserviços
Tags: webdev, beginners, microservices, architecture
Published: 2022-06-09 02:24:23


## Arquitetura de software

Quando iniciamos em qualquer carreira na área de tecnologia, principalmente como desenvolvedor web, é comum se deparar com diversos sistemas construídos de maneiras distintas que pode confundir quem está iniciando. Por ser uma área em que a todo momentos novas tecnologias e métodos são desenvolvidos e aprimorados, é importante conhecer ao menos as principais arquiteturas que dão origem a maior parte dos softwares em funcionamento.

Dentre as principais metodologias utilizadas, 3 delas se destacam, que seriam os sistemas **monolíticos**, sistemas em **camadas** ou **MVC** e sistemas em **microsserviços**.

## Sistemas monolíticos

Geralmente utilizado em tecnologias mais antigas, os sistemas monolíticos trazem todas as suas funcionalidades centralizadas em uma grande aplicação (*perceba que o termo 'monolítico' se refere a um elemento construído em um só bloco*), isto é, todas as camadas da solução se encontram em apenas um código fonte em que o mesmo detém de uma alta dependência interna. Geralmente o mesmo é responsável por a parte visual na tela do usuário (**frontend**), na manipulação, lógica e processamento das informações (**backend**) e inserção e leitura dos dados na base de dados.


![monolithic](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/poalmzdgniegch3spoz2.png)

Dentre as principais vantagens de se utilizar sistemas monolíticos, estão:

- Facilidade inicial no desenvolvimento do sistema, enquanto o nível de complexidade do sistema for baixo;
- Facilidade de entender o código, já que o mesmo se encontra todo em um só lugar;
- Eficiente para validação inicial de idéias, onde não se está bem definidos como o software vai funcionar, evitando integrações complexas em fase experimental;
- Baixa integração, onde não será necessário integrar módulos distintos, já que tudo se integra internamente.

Dentre as principais desvantagens de tal arquitetura, temos:

- Ao aumentar a complexidade do sistema, torna-se bem mais complexo a manutenção do mesmo, onde ao mexer em uma parte do sistema, pode-se instabilizar todo o sistema;
- Difícil escalabilidade, onde caso seja necessário o incremento de recursos (*processamento, memória, etc*), é necessário disponibilizar máquina para todo o sistema elevando desnecessariamente o custo, onde quase sempre o gargalo de performance ocorre apenas em alguns trechos de código;
- Emprego de uma única linguagem, pois ao ser definido a linguagem inicial, torna-se necessário o emprego da mesma em todo o sistema, inclusive em trechos cujo qual a mesma não tem performance adequadas;

Portanto, a arquitetura monolítica se mostra vantajosa em sistemas de baixa complexidade e sem perspectivas de implementações de features complexas no futuro, ou até mesmo como forma de validar como um sistema irá funcionar sem a necessidade de no momento inicial de validação da idéia seja necessário a implementação de arquiteturas complexas.


## Sistemas MVC

Sistemas utilizando a arquitetura MVC tem por principal vantagem separar o software em camadas, onde cada uma destas se torna responsável por executar tarefas específicas relativas a um sistema. Na arquitetura **MVC**, temos a camada **model**, responsável por toda a lógica interna do sistema cujo qual resolve os problemas propostos pela aplicação e controla o comportamento dos dados por meio de funções. a camada **view** é responsável por apresentar toda a interface do lado do cliente, renderizando botões, quadros, tabelas, gráficos, imagens e qualquer recurso em que seja necessário que o usuário interaja, ou seja, é o responsável por renderizar a página. Por fim, temos a **controller**, cujo qual tem o papel de mediar as requisições feitas na *view*, entregá-las à *model* e devolver a resposta ao usuário, padronizando tal comunicação de maneira eficiente para que ambos os serviços funcionem corretamente.


![mvc](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3czvlja4peex97bdi7r.png)

Dentre as principais vantagens do padrão MVC, temos:

- Separação do sistema em parte lógica e visual, onde é possível que mais de um desenvolvedor trabalhe de forma independente em cada uma das áreas (*backend e frontend*), sem que um frontend precise lidar com o backend e vice e versa;
- Permite uma melhor apresentação dos dados, já que um valor que vem do backend pode ser apresentado de diversas formas no frontend, sem comprometer o dado em si;
- Código mais organizado, onde cada camada faz sua função de maneira independente, tornando bem mais fácil entender como o software foi construído e testá-lo de maneira mais eficaz;
- Aumento da segurança do sistema, já que a camada *controller* trata todos os dados antes dos mesmos chegarem na *model*, diminuindo muito a possibilidade de problemas por conta de dados incorretos ou ausentes, podendo até mesmo utilizar-se de **middlewares** para tais validações.

já entre as principais desvantagens, temos:

- Demanda um tempo relativamente maior para o desenvolvimento, em relação a um sistema monolítico;
- Necessita de profissionais de frontend e backend para seu correto funcionamento, aumentando a demanda por desenvolvedores especializados;
- Necessita de uma infraestrutura maior em relação a sistemas monolíticos, tratando-se de aplicações simples

É muito fácil ignorar as desvantagens de tal arquitetura em relação as outras disponíveis, já que existem frameworks que facilitam muito o desenvolvimento web, tornando muito vantajoso a utilização de tal modelo na grande maioria dos casos.

## Microsserviços

Sistemas distribuídos em microsserviços são em essência, várias aplicações rodando de forma independentes (**inclusive sem compartilhamento de memória*), muitas vezes até mesmo rodando em hosts distintos, em que, ao serem integrados por meio de comunicações externas, geram funcionalidades completas. Vários módulos são separados em processos distintos, cada um executando uma parte específica de um todo, onde não há mais possibilidade de um módulo acesse qualquer recurso interno de outro módulo, sendo possível apenas a comunicação através das portas expostas dos demais. Nesse modelo, pode-se imaginar pequenas aplicações rodando em paralelo, onde uma pode requisitar outra a qualquer momento, e desde que a requisição esteja correta, tais aplicações se comunicam entre si enviando e recebendo requisições de forma a resolver o problema que o software se propõe solucionar.

![microsservices](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jfc5yo8yg4kb6bb3wfz0.png)

Dentre as principais vantagens da arquitetura em microsserviços, temos:

- Como os microsserviços são independentes, a manutenção do sistema se torna mais eficiente, já que ao modificar um dos serviços, não ocorre efeitos colaterais nos demais;
- A possibilidade de utilização de várias tecnologias em um único sistema, pois como os microsserviços são independentes e se comunicam atráves de interfaces expostas, desde que as requisições sejam feitas corretamente, nada impede um microsserviço de login em nodeJS se comunicar com um sistema que manipula muitos dados em Python, que se comunica com um sistema de transações de alta performance em Golang. Utilizando microsserviços, pode-se extrair o melhor de cada tecnologia maximizando a performance do sistema;
- A diminuição da possibilidade de falhas do sistema, pois se um dos microsserviços cair, apenas as funcionalidades que dependam do mesmo serão afetadas, não comprometendo o restante do sistema. Além da possibilidade de se executar mais de um microsserviço em paralelo (*escalonamento horizontal*) por meio de pods, onde os mesmos nem precisam estar no mesmo ambiente, garantindo que ao menos um deles estará online para suprir a demanda de solicitações.
- Simplicidade dos microsserviços, já que cada um deles irá resolver problemas específicos, tornando o código simples e relativamente fácil de se manter;
- A possibilidade de escalonamento de maneira eficiente, já que torna-se possível replicar microsserviços específicos quantas vezes forem necessárias para suprir demandas específicas por um tipo de serviço (por meio de pods em Kubernetes), sem a necessidade de escalar de maneira igualitária os outros microsserviços menos requisitados.

Porém, como desvantagem desta arquitetura, temos:

- A necessidade de integração em funcionalidades simples, já que ao criar um novo microsserviço o mesmo precisa ter toda uma interface de integração para se comunicar com os demais;
- Uma maior demanda técnica, pois é necessário um amplo conhecimento em frontend, backend e devops, sem contar a complexidade da comunicação entre os microsserviços;
- Alta complexidade da arquitetura, tornando-se inviável em aplicações simples e com pouca demanda, já que o gerenciamento de tal arquitetura é altamente complexo para tais situações. Geralmente se utiliza tal arquitetura quando um sistema se torna complexo a ponto de dificultar sua manutenção, ou quando se espera uma demanda muito alta em uma nova aplicação e necessita-se utilizar de escalonamento horizontal para otimizar os custos com infraestrutura.