Hallo zusammen!
Wir sind die .NET-Entwicklergemeinschaft der Raiffeisenbank und möchten ĂŒber eine Sammlung von Infrastruktur-Bibliotheken auf .NET Core berichten, die die schnelle Erstellung von Mikrodiensten mit einem einheitlichen Ăkosystem ermöglichen. Wir haben sie als Open Source veröffentlicht!
Ein wenig Geschichte
FrĂŒher hatten wir ein groĂes monolithisches Projekt, das sich nach und nach in eine Sammlung von Mikrodiensten verwandelte (mehr ĂŒber die Besonderheiten dieses Prozesses kann man lesen in ). Im Verlauf stieĂen wir auf das Problem, dass wir beim Erstellen neuer Mikrodienste oft verschiedene infrastrukturelle Lösungen kopieren mussten â etwa die Konfiguration des Loggings, den Umgang mit Datenbanken, WCF usw. An diesem Projekt arbeitete ein Team, und alle waren bereits an einen bestimmten etablierten Ansatz zur Arbeit mit der Infrastruktur gewöhnt. Daher haben wir den gemeinsamen Code in ein separates Repository ausgegliedert, die gesammelten Bibliotheken in Nuget-Pakete verpackt und in unser internes Nuget-Repository eingestellt.
Die Zeit verging, das Projekt wurde nach und nach zersplittert, es gab den Wunsch, neue Module der Client-Seite mit einem modernen Js-Framework zu erstellen und sie im Browser auszufĂŒhren. Wir begannen, von WCF/SOAP auf REST/HTTP umzusteigen, weshalb wir neue Bibliotheken benötigten, um Dienste basierend auf AspNet WebApi schnell zu starten. Die erste Version auf .Net Framework 4.5 wurde von unserem Architekten quasi im Alleingang in seiner Freizeit erstellt, aber sie erlaubte bereits 'Out of the Box', mit drei Zeilen in Program.cs einen Dienst zu starten, der die Authentifizierung (NTLM), Logging, Swagger, IoC/DI auf Basis von Castle Windsor, konfigurierte HTTP-Clients, die verschiedene Header fĂŒr eine durchgĂ€ngige Protokollierung im gesamten Projekt weiterleiteten, enthielt. Und all dies konnte auch zusĂ€tzlich direkt in der Konfigurationsdatei des Dienstes konfiguriert werden.
Allerdings war nicht alles reibungslos: Diese Bibliothek war Ă€uĂerst unflexibel bei der EinfĂŒhrung neuer Module. Beispielsweise musste, wenn ein spezielles Middleware hinzugefĂŒgt werden sollte, eine neue Assembly erstellt und von der Basisklasse, die den Dienst startete, abgeleitet werden, was Ă€uĂerst unpraktisch war. GlĂŒcklicherweise gab es nicht allzu viele solcher FĂ€lle.
Das Zeitalter von Docker und Kubernetes
Es kam die Zeit, als auch wir von der Welle von Docker und Kubernetes erreicht wurden, die wir aufmerksam verfolgt haben: es war eine groĂartige Gelegenheit, den technologischen Fortschritt in .Net Core voranzutreiben. Das bedeutet, dass wir eine neue Infrastruktur fĂŒr den Betrieb von Services benötigen: ein Teil der Bibliotheken wurde praktisch unverĂ€ndert von .Net Framework auf .Net Standard und .Net Core ĂŒbertragen, ein anderer Teil mit kleinen Verbesserungen. Am meisten wollten wir die Funktionen, die mit dem Start von Services in AspNet Core verbunden sind, ĂŒberarbeiten.
An erster Stelle stand das Konzept, das den groĂen Nachteil der vorherigen Version beseitigen sollte: fehlende FlexibilitĂ€t. Daher wurde beschlossen, das gesamte System von Bibliotheken so unabhĂ€ngig und modular wie möglich zu gestalten und die erforderlichen Services wie ein Baukasten zusammenzustellen.
Das Hauptziel ist es, einen einheitlichen Ansatz zu schaffen, der beschreibt, wie man mit Datenbanken, Bus-Systemen und anderen Services interagiert. Wir haben darauf geachtet, dass die Integrationen schnell und schmerzfrei sind, sodass sich die Entwickler auf die Erstellung der GeschĂ€ftslogik und nicht auf die Infrastruktur konzentrieren können â diese ist bereits bereit. Das gemeinsame Repository trĂ€gt dazu bei, die Erfahrungen der Teammitglieder zu verbessern: Wenn sehr Ă€hnliche interne Infrastrukturen verwendet werden, ist es einfacher, sich in den Entwicklungsprozess eines anderen Teams einzufinden und Fachwissen auszutauschen.
Und warum brauchen wir Open Source?
Wir möchten die Reife unserer Expertise zeigen und qualitativ hochwertiges Feedback erhalten: Eine Person von auĂerhalb der Bank wird etwas Eigenes einbringen können. AuĂerdem interessiert uns die Weiterentwicklung von Praktiken im Umgang mit Mikrodiensten und DDD im .NET Bereich in der Industrie â möglicherweise möchte jemand bestimmte Teile des Frameworks ĂŒbernehmen.
Genau genommen, ViennaNET
Schauen wir uns das nun genauer an. .
ViennaNET.WebApi.*
Dieses Bibliothekspaket besteht aus dem âWurzelâ-Element von ViennaNET.WebApi, das eine Builder-Klasse fĂŒr den Service CompanyHostBuilder enthĂ€lt, sowie einer Reihe von Konfiguratoren ViennaNET.WebApi.Configurators.*, von denen jeder es ermöglicht, bestimmte Funktionen zum erstellten Service hinzuzufĂŒgen und zu konfigurieren. Unter den Konfiguratoren finden Sie die Anbindung von Logging, Diagnostik, Authentifizierungs- und Autorisierungsarten, Swagger usw.
Hier enthĂ€lt ViennaNET.WebApi.Runners.* vorkonfigurierte Service-Builder. Diese Pakete ermöglichen es, sich nicht jedes Mal daran zu erinnern, welche Konfiguratoren beim Erstellen eines neuen Dienstes eingebunden werden mĂŒssen. Dabei schrĂ€nken sie die FunktionalitĂ€t des Service-Builders in keinster Weise ein.
ViennaNET.Mediator.*
Bibliotheken, die es ermöglichen, einen internen Mediatortyp fĂŒr Befehle und Anfragen innerhalb des Dienstes zu erstellen. Dieser Ansatz reduziert die Anzahl der DI-Injektionen auf bis zu eine, zum Beispiel in Controllern. Dadurch können verschiedene Dekoratoren zu Anfragen hinzugefĂŒgt werden, was deren Verarbeitung vereinheitlicht und den Code reduziert.
ViennaNET.Validation
Eine Assembly, die eine Reihe von Klassen zur Erstellung von Validierungsregeln und Sequenzen dieser Regeln enthĂ€lt. Sehr nĂŒtzlich fĂŒr die Implementierung von DomĂ€nenvalidierungen, da es ermöglicht, jede GeschĂ€ftsbedingung als einfache und separate Regel zu beschreiben.
ViennaNET.Redis
Eine Bibliothek mit Wrappern, die eine bequeme Arbeit mit Redis als In-Memory-Cache ermöglicht.
ViennaNET.Specifications
Eine Assembly, die Klassen enthĂ€lt, die das Muster âSpezifikationâ implementieren.
Das ist noch lange nicht alles, was unser Paket zu bieten hat. Weitere Informationen finden Sie . Bald planen wir die Veröffentlichung unserer Bibliotheken fĂŒr die Arbeit mit Datenbanken als OpenSource.
Danke fĂŒr Ihre Aufmerksamkeit, wir freuen uns auf Ihre Kommentare und Pull Requests.
Quelle: habr.com
