No trabalho, temos uma grande aplicação interna que está em desenvolvimento há quase dois anos; Acabei de ingressar no projeto recentemente e parte da arquitetura me deixa um pouco perplexo, por isso espero que alguém aqui possa fornecer alguns conselhos antes de sair para perguntar aos arquitetos essas mesmas perguntas (para que eu possa ter uma discussão informada com eles) )
Peço desculpas se o abaixo for um pouco longo, só quero tentar fazer uma boa imagem do que é o sistema antes de fazer minha pergunta :)
A maneira como o sistema é configurado é que temos um aplicativo Web principal (asp.net, AngularJS), que agrega principalmente dados de vários outros serviços. Então, basicamente, é um host para um aplicativo AngularJS; existe literalmente um controlador MVC que inicializa o lado do cliente e todos os outros controladores são um controlador WebAPI.
As chamadas do lado do cliente são tratadas por esses controladores, que são sempre implantados em caixas que não fazem nada além de hospedar o aplicativo Web. Atualmente, temos 4 caixas desse tipo.
No entanto, as chamadas são finalmente encaminhadas para outro conjunto de aplicativos WebAPI (normalmente, são por área de negócios, como segurança, dados de clientes, dados de produtos, etc.). Todos esses WebAPIs também são implantados juntos em caixas dedicadas; também temos 4 dessas caixas.
Com uma única exceção, essas WebAPIs não são usadas por nenhuma outra parte da nossa organização.
Finalmente, essas WebAPIs fazem mais um conjunto de chamadas para os serviços de "back-end", que são tipicamente serviços herdados de asmx ou wcf, colados em vários sistemas ERP e repositórios de dados (sobre os quais não temos controle).
A maior parte da lógica de negócios de nosso aplicativo está nesses WebApis, como transformar dados herdados, agregá-los, executar regras de negócios, o tipo usual de coisa.
O que me confundiu é o possível benefício que existe em ter essa separação entre o WebApplication e os WebAPIs que o servem. Como ninguém mais os usa, não vejo nenhum benefício de escalabilidade (ou seja, não há sentido em colocar outras 4 caixas de API para lidar com o aumento de carga, pois o aumento de carga nos servidores de API deve significar que há um aumento de carga nos servidores Web - portanto, deve haver uma proporção de 1: 1 de servidor Web para servidor Api)
Também não vejo nenhum benefício em ter que fazer uma chamada HTTP extra. Navegador => HTTP => WebApp => HTTP => WebAPI => HTTP => Serviços de back-end. (essa chamada HTTP entre WebApp e WebAPI é meu problema)
No momento, estou procurando pressionar para que as WebAPIs atuais sejam movidas de soluções separadas para apenas projetos separados dentro da solução WebApplication, com simples referências de projeto entre elas e um único modelo de implantação. Então eles acabariam se tornando bibliotecas de classes.
Em termos de implantação, isso significa que teríamos 8 caixas da Web "pilha completa", em vez de 4 + 4.
Os benefícios que vejo da nova abordagem são
- Aumento no desempenho porque há um ciclo a menos de serialização / desserialização entre o aplicativo Web e os servidores WebAPI
- Toneladas de código que podem ser excluídas (ou seja, sem necessidade de manutenção / teste) em termos de DTOs e mapeadores nos limites de saída e entrada dos servidores de aplicativos Web e WebApi, respectivamente.
- Melhor capacidade de criar Testes de Integração automatizados significativos, porque eu posso simplesmente zombar dos serviços de back-end e evitar a confusão nos saltos HTTP de camada intermediária.
Então a pergunta é: estou errado? Perdi alguma "mágica" fundamental de ter separado as caixas WebApplication e WebAPI?
Eu pesquisei algum material de arquitetura N-Tier, mas parece que não consigo encontrar nada que possa dar um benefício concreto para a nossa situação (uma vez que a escalabilidade não é um problema, tanto quanto eu sei, e esse é um aplicativo interno, segurança em termos de aplicativos WebAPI não é um problema.)
E também, o que eu estaria perdendo em termos de benefícios se eu reorganizasse o sistema para minha configuração proposta?