Benefícios do uso de servidores API e UI separados para aplicativos da Web

17

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?

Stephen Byrne
fonte
Se todas as oito caixas estiverem realmente sob seu controle, não consigo pensar em nenhuma boa razão para a separação. Você sabe se eles tinham propriedade separada no passado?
Ixrec 10/10
@Ixrec - sim, todas as 8 caixas pertencem à organização e o aplicativo é 100% interno apenas. Suspeito que a separação tenha sido originalmente projetada em parte porque outro grupo interno possuía a infraestrutura (muita política) e em parte porque alguém disse "N-Tier" e todo mundo simplesmente concordou.
Stephen Byrne

Respostas:

25

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.

gbjbaanb
fonte
obrigado pela perspectiva. Eu não tinha considerado o trabalho extra sendo feito pela construção da página, etc. No entanto, considerando que existe literalmente uma visualização detalhada no aplicativo e tudo que é inicializado é AngularJs, não tenho certeza se é uma preocupação nesse caso. Além disso, como o aplicativo é apenas interno, não acho que a segurança seja uma grande preocupação - tendo em mente que os serviços de back-end, onde todos os dados são realmente armazenados, sempre estarão em caixas separadas por trás dos serviços wcf, com toneladas de segurança, uma vez que são usadas por toda a organização.
Stephen Byrne
Claro, seu caso é o que é. Gostaria de saber se esses serviços podem ser consumidos por um aplicativo da web diferente no futuro (ou pretendem ser) e é por isso que ele é arquitetado como ele é. Mais uma vez, o velho arquiteto pode estar olhando para ele a 10.000 pés!
Gbjbaanb
1
Em nosso cenário, decidimos desenvolver o aplicativo móvel depois que tudo estava em produção há um tempo. Ficamos felizes em separar o servidor da API do servidor da interface do usuário, porque o aplicativo para dispositivos móveis não tinha nada a ver com o aplicativo da Web. Poderíamos dimensionar as partes 'móvel' e 'web' separadamente. Outra coisa que vale a pena notar: o aplicativo Web é realmente apenas um cliente final, o que significa que o cliente do aplicativo Web (navegador) chama o servidor API para obter dados (no nosso caso, isso é possível). As chamadas HTTP "redundantes" entre os servidores API e UI eram insignificantes em comparação com o tráfego entre o navegador / celular e o servidor API.
Michal Vician
2

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 :)

Stefan Woehrer
fonte
obrigado pelo feedback, os serviços finais de back-end são usados ​​por toda a organização e têm contratos de serviço WCF bem definidos (embora um pouco simplistas) que a organização possui. Portanto, há muita indireção se precisarmos alterar o back-end (o que, na verdade, estamos no processo de fazer, passando de um ERP para outro). Mas meu problema é que nosso aplicativo fornece um conjunto separado de APIs HTTP de middleware que são consumidas apenas por ele. Parece que uma camada demais :)
Stephen Byrne