ViennaNET: un set de biblioteci pentru backend

Salut tuturor!

Noi suntem o comunitate de dezvoltatori .NET de la Raiffeisen Bank și dorim să vă prezentăm un set de biblioteci infrastructurale pe .NET Core pentru crearea rapidă a microserviciilor cu un ecosistem unificat. L-am lansat ca Open Source!

ViennaNET: un set de biblioteci pentru backend

Puțin istorie

Odată, aveam un mare proiect monolit, care s-a transformat treptat într-un set de microservicii (despre particularitățile acestui proces puteți citi în această articole). În timpul procesului, ne-am confruntat cu problema că, la crearea de noi microservicii, adesea era necesar să copiem diverse soluții infrastructurale - cum ar fi configurarea jurnalizării, interacțiunea cu baza de date, WCF etc. La acest proiect a lucrat o singură echipă, iar toți s-au obișnuit cu o anumită abordare stabilită a lucrului cu infrastructura. De aceea, am extras codul comun într-un depozit separat, bibliotecile construite fiind ambalate în pachete NuGet și plasate în depozitul nostru intern de NuGet.

Timpul a trecut, proiectul s-a fragmentat treptat, iar dorința de a crea noi module pentru partea client a apărut, utilizând un framework JS modern și rulându-le în browser. Am început să trecem de la WCF/SOAP la REST/HTTP, astfel că aveam nevoie de noi biblioteci pentru a lansa rapid servicii pe baza AspNet WebApi. Prima versiune pe .Net Framework 4.5 a fost realizată de arhitectul nostru aproape din mers, în timpul liber, dar permitea deja din cutie, cu doar trei linii în Program.cs, să lansăm un serviciu care conținea autorizare (NTLM), jurnalizare, Swagger, IoC/DI pe baza Castle Windsor, clienți HTTP configurați care transmit diverse antete pentru a asigura jurnalizarea end-to-end în întregul proiect. Și toate acestea puteau fi configurate suplimentar direct în fișierul de configurare al serviciului.

Totuși, lucrurile nu au mers chiar atât de lin: această bibliotecă s-a dovedit a fi extrem de inflexibilă în ceea ce privește integrarea noilor module. De exemplu, dacă era necesar să adăugăm un anumit middleware special, era necesar să creăm un nou assembly și să moștenim de la clasa de bază care lansa serviciul, ceea ce era extrem de incomod. Din fericire, astfel de cazuri nu au fost foarte multe.

Epoca Docker și Kubernetes

A venit momentul când și noi am fost atinși de valul Docker și Kubernetes, la care am privit cu atenție: deoarece acesta a fost o ocazie excelentă de a continua să avansăm în tehnologii, în .Net Core. Și înseamnă că avem nevoie de o nouă infrastructură pentru a lansa servicii: o parte din biblioteci au fost transferate de la .Net Framework la .Net Standard și .Net Core practic fără modificări, o parte cu îmbunătățiri minore. Dar cel mai mult ne-am dorit să reorganizăm funcționalitatea legată de lansarea serviciilor pe AspNet Core.

Primul pas a fost să examinăm un concept care să elimine principalul dezavantaj al versiunii anterioare: lipsa de flexibilitate. Așa că am decis să facem întreaga sistemă de biblioteci cât mai independentă și modulară, și să construim serviciile necesare ca un constructor.

Obiectivul principal este de a crea o abordare unificată care să descrie cum să interacționăm cu bazele de date, bus-urile și alte servicii. Ne-am străduit să facem integrările rapide și fără dureri, astfel încât dezvoltatorii să se poată concentra pe scrierea logicii de afaceri, și nu pe infrastructură – aceasta este deja pregătită. Un depozit comun ajută la îmbunătățirea experienței de colaborare între echipe: atunci când se folosesc infrastructuri interne foarte asemănătoare, este mai ușor să te integrezi în procesul de dezvoltare al altei echipe și să împărtășești expertiza.

Și de ce avem nevoie de Open Source?

Vrem să demonstrăm maturitatea expertizei și să obținem un feedback de calitate: o persoană din afara băncii poate aduce ceva nou. De asemenea, ne interesează dezvoltarea practicilor de lucru cu microservicii și DDD pe .NET în industrie, poate cineva va dori să preia anumite părți ale framework-ului.

Practic, ViennaNET

Acum să examinăm totul mai în detaliu. Codul sursă complet l-am pus aici.

ViennaNET.WebApi.*

Acest set de biblioteci constă din „rădăcina” ViennaNET.WebApi, care conține clasa constructor pentru serviciul CompanyHostBuilder, și un set de configuratoare ViennaNET.WebApi.Configurators.*, fiecare dintre ele permițând adăugarea și configurarea unor funcționalități în serviciul creat. Printre configuratoare se pot găsi conexiuni pentru logging, diagnosticare, tipuri de autentificare și autorizare, swagger etc.

Aici, ViennaNET.WebApi.Runners.* conține constructori de servicii preconfigurați. Aceste pachete permit să nu-ți reamintești de fiecare dată, atunci când creezi un nou serviciu, ce configuratori trebuie să fie conectați. Acestea nu limitează în niciun fel funcționalitatea constructorului de servicii.

ViennaNET.Mediator.*

Biblioteci care permit crearea unei structuri interne de mediere pentru comenzi și cereri în cadrul serviciului. Această abordare reduce numărul de injecții DI la una, de exemplu, în controllere. Astfel, se pot adăuga diverse decoratoare la cereri, ceea ce le unifică procesarea și reduce cantitatea de cod.

ViennaNET.Validation

O asamblare care conține un set de clase pentru a crea reguli și secvențe de validare. Este foarte convenabilă pentru implementarea validării de domeniu, deoarece permite descrierea fiecărei condiții de afaceri sub formă de reguli simple și separate.

ViennaNET.Redis

O bibliotecă cu wrapperi pentru a lucra ușor cu Redis ca și cache in-memory.

ViennaNET.Specifications

O asamblare care conține clase ce implementează modelul „Specificație”.

Acestea nu sunt toate resursele din setul nostru. Restul pot fi consultate în repository-ul de pe GitHub. În curând vom lansa bibliotecile noastre pentru lucrul cu baze de date în OpenSource.

Mulțumim pentru atenție, așteptăm comentariile și pull request-urile dumneavoastră.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster