Andrey Kopylov , unser technischer Direktor, erklärt uns, welchen Ansatz das AREALIDEA-Webentwicklungsteam beim Entwerfen der Anwendungsarchitektur verwendet und was KISS Architecture, seine eigene Entwicklung, so gut ist.
Es gibt viele Ansätze zum Entwerfen einer Anwendungsarchitektur. MVC, DDD, Clean Architecture und viele andere.
MVC eignet sich gut für kleine Anwendungen. Wenn Sie versuchen zu skalieren, wird MVC zur gängigsten Architektur in der IT-Welt - Big Lump of Dirt .
DDD ist eine großartige Architektur, aber niemand versteht sie. Es sei denn, der Schöpfer selbst und ein paar Architekten. Der Zweck der Architektur ist es, sie für jeden Entwickler verständlich zu machen.
Saubere Architektur ist eine großartige Architektur, aber ihre vollständige Implementierung ist für große Anwendungen sinnvoll. Für kleine und mittlere Unternehmen schien es mir zu kompliziert.
Aktuelle Trends - der Übergang zu Services und Microservices - vor diesem Hintergrund wird Clean Architecture zu schwer.
Dann scheint es, als würden wir MVC für den Microservice nehmen und damit aufhören. Aber nein, ein solches Fahrrad passt nicht zu uns.
Komponenten
Das Fahrrad für Projekte in unserer Agentur wird aus Ersatzteilen aus verschiedenen architektonischen Ansätzen zusammengesetzt.
Hier sind die Komponenten, die Sie benötigen, um eine verständliche und bequeme Struktur zu erstellen:
- Router
- Controller
- Ansichten
- Dienstleistungen
- Modelle
Ebenen
Router
Der Router ist für das Weiterleiten von Anforderungen verantwortlich. Die Größe des Routers und seine Anzahl geben indirekt die Größe Ihrer Anwendung an. Für eine große monolithische Anwendung kann es mehr als eine Router-Schicht geben.
Der Router ist in jeder Architektur vorhanden, jedoch häufig implizit. Und da das Offensichtliche besser ist als das Implizite, lohnt es sich, es herauszuziehen - um es zu einem integralen Bestandteil der Architektur zu machen.
Controller
Der Controller ist eine Schicht zwischen dem Router und den Diensten. Der Controller sollte keine Geschäftslogik enthalten.
Jeder Controller steuert nur eine Entität. Wenn Sie mehr Entitäten benötigen, müssen Sie einen weiteren Controller hinzufügen.
Die Anzahl und Größe der Controller gibt indirekt die Größe Ihrer Anwendung an. Die vertikale Schicht unter der Steuerung kann in einen separaten Mikrodienst unterteilt werden.
Ansichten
Die Ansicht befindet sich in einer Ebene mit dem Controller und ist für die endgültige Anzeige der Daten verantwortlich. Der Controller überträgt die Daten nach dem Empfang von Daten vom Dienst an die Ansicht und gibt die Ansicht zur Anzeige zurück.
Im Extremfall ist View JSON, XML und ähnliche Formate.
Dienstleistungen
Nur ein Service kann Geschäftslogik enthalten. Ein Service bezieht sich normalerweise nur auf ein Modell. Ein Dienst kann einen anderen Dienst anrufen.
Die Serviceschicht ist in Befehle und Abfragen (Befehle und Abfragen) unterteilt. Dies ist der Standardansatz für CQRS .
Ein Dienst führt nur eine Funktion aus. Es kann eine beliebige Anzahl von privaten Funktionen geben und nur eine öffentliche. Der Name des Dienstes beginnt mit einem Verb. Beispiele: GetUsers, GetPostById, UpdateUser, PublishPost. Es ist der Name des Dienstes, der auf die korrekte Trennung der Funktionen hinweist.
In Abfragen werden Dienste eingefügt, die die Datenbank nicht ändern. Die Abfrage enthält eine öffentliche Get- Funktion. In Befehle setzen wir Dienste, die die Datenbank ändern. Der Befehl enthält eine öffentliche Ausführungsfunktion .
Modelle
Das Modell enthält nur die einfachste Logik zum Lesen und Speichern von Daten. Darüber hinaus beziehen sich diese Manipulationen möglicherweise nicht auf die Datenbank.
Wenn das Modell mit einer Datenbank arbeitet, dient ein Modell nur einer oder mehreren Tabellen.
Rezepte
Microservice
Nach meinem Verständnis sollte ein Microservice nur eine Entität verwalten. Daher sieht die Architektur für den einfachsten Microservice folgendermaßen aus:
- ein Router;
- ein Controller;
- mehrere Ansichten;
- mehrere Dienste;
- ein Modell.

Service
Service ist eine Mini-Anwendung. Es enthält:
- ein Router;
- mehrere Steuerungen;
- mehrere Ansichten;
- mehrere Dienste;
- Mehrere Modelle.

Monolith
Monolith ist eine großartige Anwendung. Niemand liebt Monolithen wegen ihrer Monstrosität. Ein Monolith ist gerechtfertigt, wenn Sie dem ersten Ansatz des Monolithen folgen. In diesem Zustand kann Ihre Anwendung einige Zeit verbleiben.
Der Monolith enthält:
- ein SuperRouter;
- mehrere gewöhnliche Router;
- viele Controller;
- viele Ansichten, viele Dienste;
- viele Modelle.

Es fängt an, ein wenig beängstigend auszusehen. Hier sehen Sie deutlich die zusätzliche vertikale Trennung der Schichten. Dadurch kann die Anwendung noch verwaltet und gewartet werden. Das Sägen eines Monolithen in Teile wird zu einer rein mechanischen Aufgabe.
Um die Harmonie der Architektur zu bewahren, benötigen Sie:
- Fügen Sie einen Router der obersten Ebene hinzu, der globale Pfade auflöst - SuperRouter.
- Verteilen Sie Dateien in einer Struktur nach Modulen. Das heißt, in Übereinstimmung mit der Zukunft in einzelne Dienstleistungen geschnitten.
Testen
Im Rahmen der betrachteten Architektur werden nur Services strengen Tests unterzogen - nur Geschäftslogik ist in sie eingebettet. Und Sie müssen nur nasse Modelle bekommen.
Wenn Sie etwas anderes als Dienste testen möchten, ist der Ort für die Logik wahrscheinlich falsch ausgewählt.
Fazit
Meiner Meinung nach ist KISS Architecture für 80% der Projekte geeignet und bietet eine reibungslose Entwicklung des Projekts.
Dieser architektonische Ansatz ist allen Entwicklern klar und für seine Anwendung in der Praxis müssen Sie keine dicken Bücher über DDD lesen.