Bei der Arbeit haben wir eine große interne Anwendung, die seit fast zwei Jahren entwickelt wird. Ich bin erst kürzlich dem Projekt beigetreten und ein Teil der Architektur hat mich ein wenig ratlos gemacht. Deshalb hoffe ich, dass hier jemand einen Rat geben kann, bevor ich den Architekten dieselben Fragen stelle (damit ich ein fundiertes Gespräch mit ihnen führen kann) ).
Ich entschuldige mich, wenn das Folgende etwas lang ist, ich möchte nur versuchen, ein gutes Bild von dem System zu zeichnen, bevor ich meine Frage stelle :)
Das System ist so eingerichtet, dass wir eine Hauptwebanwendung (asp.net, AngularJS) haben, die meist nur Daten von verschiedenen anderen Diensten aggregiert. Im Grunde ist es ein Host für eine AngularJS-Anwendung. Es gibt buchstäblich einen MVC-Controller, der die Clientseite bootet, und dann ist jeder andere Controller ein WebAPI-Controller.
Anrufe von der Clientseite werden von diesen Controllern verarbeitet, die immer für Boxen bereitgestellt werden, die nur die Webanwendung hosten. Wir haben derzeit 4 solcher Boxen.
Die Anrufe werden dann jedoch letztendlich an eine weitere Gruppe von WebAPI-Anwendungen weitergeleitet (in der Regel pro Geschäftsbereich, z. B. Sicherheit, Kundendaten, Produktdaten usw.). Alle diese WebAPIs werden auch zusammen auf dedizierten Boxen bereitgestellt. Wir haben auch 4 dieser Boxen.
Mit einer einzigen Ausnahme werden diese WebAPIs von keinem anderen Teil unserer Organisation verwendet.
Schließlich rufen diese WebAPIs erneut die "Back-End" -Dienste auf, bei denen es sich in der Regel um ältere asmx- oder wcf-Dienste handelt, die über verschiedene ERP-Systeme und Datenspeicher (auf die wir keinen Einfluss haben) verteilt sind.
Der größte Teil der Geschäftslogik unserer Anwendung befindet sich in diesen WebApis, z. B. das Transformieren von Altdaten, das Aggregieren, das Ausführen von Geschäftsregeln, die übliche Art von Dingen.
Was mich verwirrt hat, ist der mögliche Nutzen einer solchen Trennung zwischen der WebApplication und den dazugehörigen WebAPIs. Da sie von niemand anderem verwendet werden, sehe ich keinen Vorteil in Bezug auf die Skalierbarkeit (dh es macht keinen Sinn, weitere 4 API-Boxen einzubauen, um die erhöhte Auslastung der API-Server zu bewältigen, da eine erhöhte Auslastung der Webserver bedeuten muss - daher muss das Verhältnis von Webserver zu Api-Server 1: 1 sein)
Ich sehe auch überhaupt keinen Vorteil darin, einen zusätzlichen HTTP-Aufruf durchführen zu müssen. Browser => HTTP => WebApp => HTTP => WebAPI => HTTP => Backend-Dienste. (dieser HTTP-Aufruf zwischen WebApp und WebAPI ist mein Problem)
Daher bin ich derzeit bestrebt, die aktuellen WebAPIs von separaten Lösungen auf nur separate Projekte innerhalb der WebApplication-Lösung mit einfachen Projektreferenzen dazwischen und einem einzelnen Bereitstellungsmodell zu verschieben. Sie würden also letztendlich nur zu Klassenbibliotheken.
In Bezug auf die Bereitstellung bedeutet dies, dass wir im Gegensatz zu 4 + 4 8 Webboxen mit "vollem Stapel" hätten.
Die Vorteile des neuen Ansatzes sind:
- Leistungssteigerung, da zwischen der Webanwendung und den WebAPI-Servern ein Zyklus weniger Serialisierung / Deserialisierung stattfindet
- Tonnenweise Code, der im Hinblick auf DTOs und Mapper an den ausgehenden und eingehenden Grenzen der Webanwendungs- bzw. WebApi-Server gelöscht werden kann (dh keine Wartung / Prüfung erforderlich ist).
- Bessere Fähigkeit, aussagekräftige automatisierte Integrationstests zu erstellen, da ich einfach die Back-End-Services verspotten und die Unordnung bei den HTTP-Sprüngen der mittleren Ebene vermeiden kann.
Die Frage ist also: irre ich mich? Habe ich eine fundamentale "Magie" der Trennung von WebApplication- und WebAPI-Boxen verpasst?
Ich habe einige N-Tier-Architekturmaterialien recherchiert, kann aber anscheinend nichts darin finden, was einen konkreten Vorteil für unsere Situation bietet (da Skalierbarkeit, soweit ich das beurteilen kann, kein Problem darstellt und dies eine interne App ist) Sicherheit in Bezug auf die WebAPI-Anwendungen ist kein Problem.)
Und was würde ich in Bezug auf die Vorteile verlieren, wenn ich das System zu meinem vorgeschlagenen Setup umstrukturieren würde?