Arquitetura KISS. Do microsserviço ao monólito

Andrey Kopylov , nosso diretor técnico, nos diz qual a abordagem que a equipe de desenvolvimento web da AREALIDEA usa para projetar a arquitetura de aplicativos e qual é a qualidade do KISS Architecture, seu próprio desenvolvimento.



Existem muitas abordagens para projetar uma arquitetura de aplicativo. MVC, DDD, Arquitetura Limpa e muitos outros.


O MVC é adequado para pequenas aplicações. Quando você tenta escalar, o MVC se transforma na arquitetura mais comum no mundo da TI - Big Lump of Dirt .


DDD é uma ótima arquitetura, mas ninguém entende. A menos que o próprio criador e alguns arquitetos. O objetivo da arquitetura é torná-la compreensível para todos os desenvolvedores.


Arquitetura Limpa é uma ótima arquitetura, mas sua implementação completa faz sentido para aplicativos enormes. Para pequenas e médias, me pareceu muito complicado.


Tendências atuais - a transição para serviços e microsserviços - nesse contexto, a Arquitetura Limpa está se tornando muito pesada.


Parece, então, vamos usar o MVC para microsserviço e parar com isso. Mas não, essa bicicleta não nos convém.


Componentes


A bicicleta para projetos em nossa agência é montada a partir de peças de reposição de diferentes abordagens arquitetônicas.


Aqui estão os componentes necessários para criar uma estrutura compreensível e conveniente:


  • Roteadores
  • Controladores
  • Visualizações
  • Serviços
  • Modelos

Camadas


Roteador


O roteador é responsável por solicitações de roteamento. O tamanho do roteador e seu número indica indiretamente o tamanho do seu aplicativo. Para uma aplicação monolítica grande, pode haver mais de uma camada de roteadores.


O roteador está presente em qualquer arquitetura, mas geralmente implicitamente. E como o óbvio é melhor que o implícito, vale a pena retirá-lo - para torná-lo parte integrante da arquitetura.


Controlador


O controlador é uma camada entre o roteador e os serviços. Não deve haver lógica comercial no controlador.


Cada controlador controla apenas uma entidade. Se você precisar de mais entidades, precisará adicionar outro controlador.


O número e o tamanho dos controladores indicam indiretamente o tamanho do seu aplicativo. A camada vertical sob o controlador pode ser separada em um microsserviço separado.


Visualizações


Vista está em uma camada com o controlador, é responsável pela exibição final dos dados. O controlador depois de receber dados do serviço transfere os dados para o modo de exibição e retorna o modo de exibição para exibição.


No caso extremo, o View é JSON, XML e formatos semelhantes.


Serviços


Somente um serviço pode conter lógica de negócios. Um serviço geralmente se refere a apenas um modelo. Um serviço pode chamar outro serviço.


A camada de serviço é dividida em comandos e consultas (comandos e consultas). Essa é a abordagem padrão para o CQRS .


Um serviço executa apenas uma função. Pode haver qualquer número de funções privadas e apenas um público. O nome do serviço começa com um verbo. Exemplos: GetUsers, GetPostById, UpdateUser, PublishPost. É o nome do serviço que sugere a separação correta da funcionalidade.


Nas consultas, colocamos serviços que não modificam o banco de dados. A consulta contém uma função pública de obtenção . Em Comandos, colocamos serviços que alteram o banco de dados. O comando contém uma função pública de execução .


Modelos


O modelo contém apenas a lógica mais simples associada à leitura e salvamento de dados. Além disso, essas manipulações podem não estar relacionadas ao banco de dados.


Se o modelo funcionar com um banco de dados, um modelo servirá apenas uma ou várias tabelas.


Receitas


Microserviço


Um microsserviço, no meu entendimento, deve gerenciar apenas uma entidade. Portanto, a arquitetura do microsserviço mais simples terá a seguinte aparência:


  • um roteador;
  • um controlador;
  • múltiplas visões;
  • vários serviços;
  • um modelo.


Serviço


O serviço é um mini aplicativo. Contém:

  • um roteador;
  • vários controladores;
  • múltiplas visões;
  • vários serviços;
  • Vários modelos.


Monólito


Monólito é uma ótima aplicação. Ninguém ama monólitos por causa de sua monstruosidade. Um monólito é justificado se você seguir a primeira abordagem do monólito. Nesse estado, seu aplicativo pode permanecer por algum tempo.


O monólito contém:


  • um SuperRouter;
  • vários roteadores comuns;
  • muitos controladores;
  • muitas visões, muitos serviços;
  • muitos modelos.


Começa a parecer um pouco assustador. Aqui você pode ver claramente a separação vertical adicional das camadas. Isso permite que o aplicativo permaneça ainda gerenciado e mantido. Serrar um monólito em partes se torna uma tarefa puramente mecânica.


Para preservar a harmonia da arquitetura, você precisa:


  1. Adicione um roteador de nível superior que resolverá os caminhos globais - SuperRouter.
  2. Distribua arquivos em uma estrutura por módulo. Ou seja, de acordo com o futuro cortado em serviços individuais.

Teste


Dentro da estrutura da arquitetura em consideração, apenas os serviços estão sujeitos a testes rigorosos - apenas a lógica de negócios é incorporada a eles. E você só precisa se molhar modelos.


Se você deseja testar algo diferente de serviços, provavelmente o local da lógica foi escolhido incorretamente.


Conclusão


Na minha opinião, o KISS Architecture é adequado para 80% dos projetos e fornece uma evolução suave do projeto.


Essa abordagem arquitetônica ficará clara para todos os desenvolvedores e, para sua aplicação na prática, você não precisa ler livros pesados ​​sobre DDD.

Source: https://habr.com/ru/post/pt440034/


All Articles