web-dev-qa-db-fra.com

Avantages d'utiliser des serveurs API et UI distincts pour les applications Web

Au travail, nous avons une grande application interne qui est en développement depuis près de 2 ans maintenant; Je viens de rejoindre le projet récemment et une partie de l'architecture me laisse un peu perplexe, donc j'espère que quelqu'un ici pourra fournir des conseils avant de sortir poser les mêmes questions aux architectes (afin que je puisse avoir une discussion éclairée avec eux ).

Je m'excuse si ce qui suit est un peu long, je veux juste essayer de peindre une bonne image de ce qu'est le système avant de poser ma question :)

  • La façon dont le système est configuré est que nous avons une application Web principale (asp.net, AngularJS) qui agrège principalement les données de divers autres services. Donc, fondamentalement, c'est un hôte pour une application AngularJS; il y a littéralement un contrôleur MVC qui démarre le côté client, puis tous les autres contrôleurs sont des contrôleurs WebAPI.

  • Les appels côté client sont gérés par ces contrôleurs, qui sont toujours déployés dans des boîtiers qui ne font qu'héberger l'application Web. Nous en avons actuellement 4.

  • Cependant, les appels sont ensuite acheminés vers un autre ensemble d'applications WebAPI (généralement celles-ci par domaine d'activité, telles que la sécurité, les données client, les données produit, etc.). Toutes ces WebAPI sont également déployées sur des boîtiers dédiés; nous avons également 4 de ces boîtes.

  • À une seule exception près, ces WebAPI ne sont utilisées par aucune autre partie de notre organisation.

  • Enfin, ces WebAPI effectuent encore un autre ensemble d'appels aux services "back end", qui sont généralement des services asmx ou wcf hérités giflés au-dessus de divers systèmes et magasins de données ERP ERP $ === sur lesquels nous n'avons pas de contrôle).

  • La plupart des logiques métier de notre application se trouvent dans ces WebApis, comme la transformation de données héritées, leur agrégation, l'exécution de règles métier, le type de chose habituel.

Ce qui m'a dérouté, c'est quel avantage possible il y a à avoir une telle séparation entre la WebApplication et les WebAPI qui la servent. Étant donné que personne d'autre ne les utilise, je ne vois aucun avantage d'évolutivité (c'est-à-dire qu'il est inutile de mettre 4 autres boîtes API pour gérer une charge accrue, car une charge accrue sur les serveurs API doit signifier qu'il y a une charge accrue sur les serveurs Web - par conséquent, il doit y avoir un rapport 1: 1 du serveur Web au serveur Api)

  • Je ne vois pas non plus d'avantage d'avoir à faire un appel HTTP supplémentaire Navigateur => HTTP => WebApp => HTTP => WebAPI => HTTP => Services backend. (cet appel HTTP entre WebApp et WebAPI est mon problème)

  • Je cherche donc actuellement à pousser pour que les WebAPI actuelles soient déplacées de solutions distinctes, à des projets juste séparés dans la solution WebApplication, avec des références de projet simples entre les deux et un modèle de déploiement unique. Ils deviendraient donc finalement des bibliothèques de classes.

  • Au niveau du déploiement, cela signifie que nous aurions 8 boîtes Web "full stack", par opposition à 4 + 4.

Les avantages que je vois de la nouvelle approche sont

  • Augmentation des performances car il y a un cycle de sérialisation/désérialisation en moins entre l'application Web et les serveurs WebAPI
  • Des tonnes de code qui peuvent être supprimés (c'est-à-dire pas besoin de maintenir/tester) en termes de DTO et de mappeurs aux limites sortantes et entrantes des serveurs d'application Web et WebApi respectivement.
  • Meilleure capacité à créer des tests d'intégration automatisés significatifs, car je peux simplement me moquer des services principaux et éviter le désordre autour des sauts HTTP de niveau intermédiaire.

La question est donc: ai-je tort? Ai-je manqué une "magie" fondamentale d'avoir séparé les boîtes WebApplication et WebAPI?

J'ai fait des recherches sur certains matériaux d'architecture à N niveaux, mais je n'arrive pas à trouver quoi que ce soit qui puisse apporter un avantage concret à notre situation (car l'évolutivité n'est pas un problème pour autant que je sache, et c'est une application interne donc la sécurité des applications WebAPI n'est pas un problème.)

Et aussi, que serais-je en train de perdre en termes d'avantages si je devais réorganiser le système selon la configuration proposée?

19
Stephen Byrne

Une des raisons est la sécurité - si (haha! quand) un pirate accède à votre serveur Web frontal, il a accès à tout ce à quoi il a accès. Si vous avez placé votre niveau intermédiaire dans le serveur Web, alors il a accès à tout ce qu'il a - c'est-à-dire à votre base de données, et la prochaine chose que vous savez, il exécute simplement "select * from users" sur votre base de données et le retire hors ligne craquage de mot de passe.

Une autre raison est la mise à l'échelle - le niveau Web où les pages sont construites et déformées et traitées XML et tout cela prend beaucoup plus de ressources que le niveau intermédiaire qui est souvent une méthode efficace pour obtenir des données de la base de données vers le niveau Web. Sans oublier de transférer toutes ces données statiques qui résident (ou sont mises en cache) sur le serveur Web. Ajouter plus de serveurs Web est une tâche simple une fois que vous avez passé le 1. Il ne devrait pas y avoir de rapport 1: 1 entre les niveaux Web et logique - j'ai déjà vu 8: 1 (et un rapport 4: 1 entre la logique tier et DB). Cela dépend de ce que font vos niveaux et de la quantité de cache qui s'y déroule.

Les sites Web ne se soucient pas vraiment des performances d'un utilisateur unique car ils sont conçus pour évoluer, peu importe qu'il y ait un appel supplémentaire qui ralentit un peu les choses si cela signifie que vous pouvez servir plus d'utilisateurs.

Une autre raison pour laquelle il peut être bon d'avoir ces couches est qu'elle force plus de discipline dans le développement où une API est développée (et facilement testée car elle est autonome), puis l'interface utilisateur développée pour la consommer. J'ai travaillé dans un endroit qui faisait cela - différentes équipes ont développé différentes couches et cela fonctionnait bien car elles avaient des spécialistes pour chaque niveau qui pouvaient lancer les changements très rapidement parce qu'ils n'avaient pas à se soucier des autres niveaux - c'est-à-dire un développeur javscript d'interface utilisateur pourrait ajouter une nouvelle section au site en consommant simplement un nouveau service Web que quelqu'un d'autre a développé.

26
gbjbaanb

Je pense qu'il n'y a pas de bonne/mauvaise réponse ici. Avez-vous interrogé vos collègues sur le but de cette architecture?

D'après la façon dont je comprends vos descriptions, le " WebAPI" dans votre architecture sert de sorte de middleware self-made. Vous pouvez maintenant rechercher les avantages des utilisations d'un middleware. Fondamentalement, votre Webapp n'aurait jamais besoin d'être adoptée si vous modifiez votre système de backoffice (tant que l'interface WebAPI reste la même).

Pour aller plus loin: imaginez que vous disposez d'une base de données clients (service backend) et que 5 applications web communiquent avec cette base de données. Si vous remplacez le système de base de données client par un nouveau système (comme celui d'un autre fournisseur et que vous ne pouvez pas influencer les interfaces de service Web), vous devrez probablement changer la couche de communication des 5 applications Web. Si vous communiquez via votre WebAPI, il vous suffira de changer la couche de communication de WebAPI.

Fondamentalement, l'architecture de couche est aujourd'hui considérée à la fois comme: Motif et Anti-Motif. (Voir: Code Lasagne ) Si vous Je n'ai qu'un seul système sans l'intention de l'étendre davantage au cours des prochaines années. Je préfère considérer cela comme anti-modèle. Mais ce serait un juge taff irréaliste, car je ne connais pas les circonstances/situation exactes :)

3
Stefan Woehrer