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?
fonte
Respostas:
Uma razão é a segurança - se (haha! Quando ) um hacker obtém acesso ao seu servidor web front-end, ele obtém acesso a tudo o que tem acesso. Se você colocou sua camada intermediária no servidor da Web, ele tem acesso a tudo o que tem - ou seja, seu banco de dados e, em seguida, você sabe que ele acabou de executar "select * from users" no seu banco de dados e retirá-lo do modo offline quebra de senha.
Outro motivo é o dimensionamento - a camada da Web em que as páginas são construídas, desconfiguradas e processadas por XML e tudo o que consome muito mais recursos do que a camada intermediária, que geralmente é um método eficiente de obter dados do banco de dados para a camada da Web. Sem mencionar a transferência de todos os dados estáticos que residem (ou são armazenados em cache) no servidor da web. Adicionar mais servidores da web é uma tarefa simples, depois que você passa do 1. Não deve haver uma proporção de 1: 1 entre as camadas da web e lógica - já vi 8: 1 até agora (e uma proporção de 4: 1 entre a lógica nível e DB). Depende do que suas camadas fazem, no entanto, e quanto de cache ocorre nelas.
Os sites realmente não se importam com o desempenho de usuário único, pois são criados em escala, não importa se há uma chamada extra que atrasa um pouco as coisas, se isso significa que você pode atender mais usuários.
Outro motivo pelo qual pode ser bom ter essas camadas é que ela força mais disciplina no desenvolvimento, onde uma API é desenvolvida (e facilmente testada por ser independente) e, em seguida, a interface do usuário é desenvolvida para consumi-la. Eu trabalhei em um local que fez isso - equipes diferentes desenvolveram camadas diferentes e funcionou bem, pois eles tinham especialistas para cada camada que poderiam fazer alterações muito rapidamente porque não precisavam se preocupar com as outras camadas - por exemplo, um UI javscript dev poderia adicionar uma nova seção ao site simplesmente consumindo um novo serviço da web que alguém havia desenvolvido.
fonte
Eu acho que não há resposta certa / errada aqui. Você já perguntou aos seus colegas sobre o objetivo dessa arquitetura?
Pelo que entendi suas descrições, o " WebAPI " em sua arquitetura serve como um tipo de Middleware criado por você. Agora você pode pesquisar quais vantagens existem no uso de um Middleware. Basicamente, seu Webapp nunca precisaria ser adotado se você alterasse seu sistema de backoffice (desde que a interface WebAPI permaneça a mesma).
Para ir além: imagine que você tenha um banco de dados de clientes (serviço de back-end) e 5 aplicativos da Web se comunicando com esse banco de dados. Se você substituir o sistema de banco de dados do cliente por um novo sistema (como de outro fornecedor e não puder influenciar as interfaces de serviço da web), provavelmente precisará alterar a camada de comunicação dos 5 aplicativos da web. Se você se comunica por meio da sua WebAPI , basta alterar a camada de comunicação da WebAPI .
Basicamente, a Arquitetura de Camadas é atualmente considerada como: Padrão e Antipadrão. (Veja: Código de Lasanha ) Se você tiver apenas um sistema sem planos para expandir isso ainda mais nos próximos anos, prefiro considerá-lo como antipadrão. Mas isso não seria um juiz irrealista, pois eu não sei exatamente as circunstâncias / situações :)
fonte