ViennaNET: eine Reihe von Bibliotheken für das Backend

Hallo an alle!

Wir sind eine Community von .NET-Entwicklern bei der Raiffeisenbank und möchten über eine Reihe von Infrastrukturbibliotheken auf Basis von .NET Core sprechen, um schnell Microservices mit einem einzigen Ökosystem zu erstellen. Sie haben es zu Open Source gebracht!

ViennaNET: eine Reihe von Bibliotheken für das Backend

Ein wenig Geschichte

Es war einmal ein großes monolithisches Projekt, das sich nach und nach in eine Reihe von Microservices verwandelte (die Merkmale dieses Prozesses können Sie in lesen). Dieser Artikel). Dabei stießen wir auf das Problem, dass wir bei der Erstellung neuer Microservices häufig verschiedene Infrastrukturlösungen kopieren mussten – etwa das Einrichten der Protokollierung, das Arbeiten mit einer Datenbank, WCF usw. Ein Team arbeitete an diesem Projekt und jeder war bereits mit einem etablierten Ansatz für die Arbeit mit der Infrastruktur vertraut. Daher haben wir den allgemeinen Code in ein separates Repository aufgeteilt, die gesammelten Bibliotheken in Nuget-Pakete verpackt und sie in unserem internen Nuget-Repository abgelegt.

Die Zeit verging, das Projekt fragmentierte allmählich und es entstand der Wunsch, neue clientseitige Module auf einem modernen JS-Framework zu erstellen und sie im Browser auszuführen. Wir begannen mit der Umstellung von WCF/SOAP auf REST/HTTP und benötigten daher neue Bibliotheken, um auf AspNet WebApi basierende Dienste schnell zu starten. Die erste Version des .Net Framework 4.5 wurde von unserem Architekten fast auf den Knien in seiner Freizeit erstellt, aber sofort war es möglich, einen Dienst mit drei Zeilen in Program.cs zu starten, die die Autorisierung (NTLM) enthielten. Logging, Swagger, IoC/DI auf Basis von Castle Windsor, angepasste HTTP-Clients, die verschiedene Header weiterleiten, um eine End-to-End-Protokollierung während des gesamten Projekts bereitzustellen. Und das Ganze könnte direkt in der Dienstkonfigurationsdatei weiter konfiguriert werden.

Allerdings verlief nicht alles reibungslos: Diese Bibliothek erwies sich hinsichtlich der Einführung neuer Module als äußerst unflexibel. Wenn Sie beispielsweise eine spezielle Middleware hinzufügen mussten, mussten Sie eine neue Assembly erstellen und von der Basisklasse erben, die den Dienst ausführt, was äußerst umständlich war. Glücklicherweise gab es nicht sehr viele solcher Fälle.

Die Ära von Docker und Kubernetes

Es ist die Zeit gekommen, in der die Welle von Docker und Kubernetes uns erreicht hat, die wir genau beobachtet haben: Schließlich war es eine großartige Chance, die Technologien in .Net Core weiter voranzutreiben. Das bedeutet, dass wir eine neue Infrastruktur benötigen, um Dienste auszuführen: Einige Bibliotheken sind praktisch ohne Änderungen vom .Net Framework auf .Net Standard und .Net Core migriert, einige mit geringfügigen Verbesserungen. Vor allem aber wollte ich die Funktionalität überarbeiten, die mit dem Starten von Diensten auf AspNet Core verbunden ist.

Als erstes dachten wir über ein Konzept nach, das den Hauptnachteil der Vorgängerversion beseitigen würde: mangelnde Flexibilität. Daher wurde beschlossen, das gesamte Bibliothekssystem möglichst unabhängig und modular zu gestalten und die für die Funktionalität notwendigen Dienste als Konstruktor zusammenzustellen.

Das Hauptziel besteht darin, einen einheitlichen Ansatz zu schaffen, der beschreibt, wie mit Datenbanken, Bussen und anderen Diensten interagiert wird. Wir haben versucht, Integrationen schnell und schmerzlos zu gestalten, und Entwickler konnten sich auf das Schreiben der Geschäftslogik und nicht auf die Infrastruktur konzentrieren – sie ist bereits fertig. Ein gemeinsames Repository trägt dazu bei, die Erfahrung der Interaktion innerhalb von Teams zu verbessern: Wenn sehr ähnliche interne Infrastrukturen verwendet werden, ist es einfacher, sich dem Entwicklungsprozess eines anderen Teams anzuschließen und Fachwissen auszutauschen.

Und warum brauchen wir Open Source?

Wir wollen die Reife unserer Expertise zeigen und qualitativ hochwertiges Feedback erhalten: Eine Person außerhalb der Bank kann etwas von sich einbringen. Wir sind auch an der Entwicklung von Praktiken für die Arbeit mit Microservices und DDD auf .NET in der Industrie interessiert; vielleicht möchte jemand bestimmte Teile des Frameworks übernehmen.

Eigentlich ViennaNET

Schauen wir uns das nun genauer an. Der vollständige Quellcode wird hier veröffentlicht.

ViennaNET.WebApi.*

Dieser Bibliothekssatz besteht aus der „Root“ ViennaNET.WebApi, die die Builder-Klasse für den CompanyHostBuilder-Dienst enthält, und einem Satz Konfiguratoren ViennaNET.WebApi.Configurators.*, mit denen Sie jeweils einige Funktionen zu den erstellten hinzufügen und konfigurieren können Service. Unter den Konfiguratoren finden Sie Anschlüsse für Protokollierung, Diagnose, Authentifizierungs- und Autorisierungsarten, Swagger usw.

ViennaNET.WebApi.Runners.* enthält auch vorkonfigurierte Service Builder. Diese Pakete ermöglichen es Ihnen, sich nicht jedes Mal, wenn Sie einen neuen Dienst erstellen, daran zu erinnern, welche Konfiguratoren angeschlossen werden müssen. Sie schränken die Funktionalität des Service Builders jedoch in keiner Weise ein.

ViennaNET.Mediator.*

Bibliotheken, mit denen Sie einen internen Zwischenbus für Befehle und Anforderungen innerhalb eines Dienstes erstellen können. Mit diesem Ansatz können Sie beispielsweise in Steuerungen die Anzahl der DI-Einspritzungen auf eine reduzieren. Dadurch können Sie Anfragen verschiedene Dekoratoren hinzufügen, was deren Verarbeitung vereinheitlicht und die Codemenge reduziert.

ViennaNET.Validierung

Eine Assembly, die eine Reihe von Klassen zum Erstellen von Validierungsregeln und -sequenzen daraus enthält. Es ist sehr praktisch für die Implementierung der Domänenvalidierung, da Sie damit jede Geschäftsbedingung in Form einer einfachen und separaten Regel beschreiben können.

ViennaNET.Redis

Eine Bibliothek mit Wrappern für die bequeme Arbeit mit Redis als In-Memory-Cache.

ViennaNET.Spezifikationen

Eine Assembly mit Klassen, die das Spezifikationsmuster implementieren.

Das ist nicht alles, was in unserem Set enthalten ist. Den Rest könnt ihr sehen im GitHub-Repository. Wir planen, unsere Bibliotheken für die Arbeit mit Datenbanken bald auf OpenSource freizugeben.

Vielen Dank für Ihre Aufmerksamkeit, wir freuen uns auf Ihre Kommentare und Pull-Requests.

Source: habr.com

Kommentar hinzufügen