Ahoj všichni!
Jsme komunitou .NET vývojářů Raiffeisenbank a chceme vám představit sadu infrastrukturních knihoven na .NET Core pro rychlé vytváření mikroservis s jednotným ekosystémem. Uvolnili jsme to jako Open Source!
Trocha historie
Kdysi jsme měli velký monolitický projekt, který se postupně transformoval na sadu mikroservis (o zvláštnostech tohoto procesu si můžete přečíst v ). Během procesu jsme se setkali s problémem, že při vytváření nových mikroservis jsme často museli kopírovat různá infrastrukturní řešení – jako jsou konfigurace logování, práce s databází, WCF atd. Na tomto projektu pracoval jeden tým a všichni si již zvykli na určitou ustálenou metodiku práce s infrastrukturou. Proto jsme vyčlenili společný kód do samostatného repozitáře, sestavené knihovny jsme zabalili do NuGet balíčků a umístili je do našeho interního NuGet úložiště.
Čas plynul, projekt se postupně štěpil, objevila se touha vytvářet nové moduly klientské části pomocí moderního Js frameworku a spouštět je v prohlížeči. Začali jsme přecházet z WCF/SOAP na REST/HTTP, a proto jsme potřebovali nové knihovny pro rychlý start služeb na bázi AspNet WebApi. První verzi na .NET Framework 4.5 vytvořil náš architekt téměř na koleně ve svém volném čase, ale už z krabice umožňovala třemi řádky v Program.cs spustit službu, která obsahovala autorizaci (NTLM), logování, Swagger, IoC/DI na bázi Castle Windsor, nakonfigurované HTTP klienty, které předávaly různé hlavičky pro zajištění průchodu logování po celém projektu. A to vše bylo možné navíc konfigurovat přímo v konfiguračním souboru služby.
Nicméně ne všechno bylo hladké: tato knihovna se ukázala jako extrémně nepružná, pokud šlo o zavádění nových modulů. Například, pokud bylo potřeba přidat nějaké speciální midlleware, museli jsme vytvořit novou sestavu a dědit od základní třídy spouštějící službu, což bylo velmi nepohodlné. Naštěstí takových případů nebylo příliš mnoho.
Éra Dockeru a Kubernetes
Přišel čas, kdy k nám dorazila vlna s Dockerem a Kubernetes, kterou jsme pozorně sledovali: byla to skvělá příležitost, jak se posunout dál v technologiích směrem k .Net Core. A to znamená, že budeme potřebovat novou infrastrukturu pro spuštění služeb: část knihoven přešla z .Net Framework na .Net Standard a .Net Core prakticky bez změn, část s drobnými vylepšeními. Ale nejvíce jsme chtěli přepracovat funkčnost spojenou se spuštěním služeb na AspNet Core.
Prvním krokem bylo zvažování konceptu, který by odstranil hlavní nedostatek předchozí verze: nedostatek flexibility. Proto bylo rozhodnuto udělat celý systém knihoven co nejvíce nezávislý a modulární a sestavit potřebné služby podle funkce jako stavebnici.
Hlavním cílem je vytvořit jednotný přístup, který popisuje, jak interagovat s databázemi, sběrnicemi a dalšími službami. Snažili jsme se, aby integrace byly rychlé a bezbolestné a aby se vývojáři mohli soustředit na psaní obchodní logiky, a ne na infrastrukturu – ta je už připravena. Společný repozitář pomáhá zlepšit zkušenosti s interakcí uvnitř týmů: když se používají velmi podobné interní infrastruktury, je snazší zapojit se do vývojového procesu jiného týmu a sdílet odborné znalosti.
A proč potřebujeme Open Source?
Chceme ukázat zralost naší odbornosti a získat kvalitní zpětnou vazbu: člověk mimo banku může přinést něco nového. Také nás zajímá rozvoj praktik práce s mikroslužbami a DDD na .NET v průmyslu, možná si někdo bude chtít vzít určité části frameworku pro sebe.
Vlastně, ViennaNET
Teď se podívejme na vše podrobněji. .
ViennaNET.WebApi.*
Tato sada knihoven se skládá z "kořene" ViennaNET.WebApi, který obsahuje stavbu třídy pro službu CompanyHostBuilder, a skupiny konfigurátorů ViennaNET.WebApi.Configurators.*, přičemž každý z nich umožňuje přidat a konfigurovat určitou funkčnost do vytvářené služby. Mezi konfigurátory lze nalézt propojení logování, diagnostiky, typu autentizace a autorizace, swaggeru atd.
ViennaNET.WebApi.Runners.* obsahuje předem nakonfigurované stavitele služeb. Tyto balíky umožňují zapomenout na to, jaké konfigurátory je třeba připojit při tvorbě nové služby. Ani v nejmenším neomezují funkčnost stavitele služeb.
ViennaNET.Mediator.*
Knihovny, které umožňují vytvořit vnitřní zprostředkovatelskou sběrnici pro příkazy a dotazy uvnitř služby. Tento přístup snižuje počet DI-injekcí na jednu, například ve controllerech. Díky tomu lze přidávat různé dekorátory k dotazům, což sjednocuje jejich zpracování a zkracuje množství kódu.
ViennaNET.Validation
Knihovna obsahující sadu tříd pro vytváření validačních pravidel a sekvencí z nich. Velmi užitečné pro implementaci doménové validace, protože umožňuje popsat každou obchodní podmínku jako jednoduché a samostatné pravidlo.
ViennaNET.Redis
Knihovna s obálkami pro pohodlnou práci s Redis jako in-memory cache.
ViennaNET.Specifications
Knihovna obsahující třídy implementující vzor „Specifikace“.
To rozhodně není všechno, co máme v našem arzenálu. Ostatní si můžete prohlédnout . Brzy plánujeme vydání našich knihoven pro práci s databázemi na OpenSource.
Děkujeme za pozornost, těšíme se na vaše komentáře a pull requesty.
Zdroj: habr.com
