ViennaNET: набор от библиотеки за бекенд

Здравейте на всички!

Ние сме общност от .NET разработчици на Райфайзенбанк и искаме да разкажем за набора от инфраструктурни библиотеки на .NET Core за бързо създаване на микросервизи с единна екосистема. Публикувахме го с отворен код!

ViennaNET: набор от библиотеки за бекенд

Малко история

Преди време имахме голям монолитен проект, който постепенно се превърна в набор от микросервизи (за особеностите на този процес можете да прочетете в тази статия). В процеса се сблъскахме с проблема, че при създаването на нови микросервизи често се налагаше да копираме различни инфраструктурни решения – като настройки за логване, работа с БД, WCF и т.н. По този проект работеше един екип и всички вече свикнаха с определен подход за работа с инфраструктурата. Затова отделихме общия код в отделен репозиторий, събрани библиотеки опаковахме в Nuget пакети и ги поставихме в нашето вътрешно Nuget хранилище.

Времето минаваше, проектът постепенно се делеше, появи се желанието да създадем нови модули за клиентската част на съвременен Js фреймуорк и да ги стартираме в браузъра. Започнахме да преминаваме от WCF/SOAP на REST/HTTP, затова ни бяха нужни нови библиотеки за бързо стартиране на услуги на базата на AspNet WebApi. Първата версия на .Net Framework 4.5 беше направена от нашия архитект почти на крак в свободното му време, но вече позволяваше с три реда в Program.cs да стартираме услуга, която съдържаше автентикация (NTLM), логване, Swagger, IoC/DI на базата на Castle Windsor, настроени HTTP клиенти, прехвърлящи различни заглавия за осигуряване на крайно логване в целия проект. И всичко това можеше допълнително да бъде конфигурирано вече в самия конфигурационен файл на услугата.

Но не всичко беше гладко: тази библиотека се оказа изключително непригодна за внедряване на нови модули. Например, ако трябваше да добавим някакво специално middleware, се налагаше да създаваме нова сборка и да наследяваме от базовия клас, който стартира услугата, което беше изключително неудобно. За щастие, подобни случаи не бяха много.

Епохата на Docker и Kubernetes

Дойде времето, когато и до нас достигна вълната на Docker и Kubernetes, за която внимателно наблюдавахме: това беше прекрасна възможност да продължим напред с технологиите в .Net Core. Следователно, ще ни е необходима нова инфраструктура за стартиране на услугите: част от библиотеките преминаха от .Net Framework на .Net Standard и .Net Core почти без промени, а част с малки подобрения. Но най-много искахме да преработим функционалността, свързана с стартирането на услуги в AspNet Core.

Първото нещо, което разгледахме, беше концепт, който да премахне основния недостатък на предишната версия: липсата на гъвкавост. Затова решихме да направим цялата система от библиотеки възможно най-независима и модулна и да събираме необходимите функционални услуги като конструктор.

Основната цел е да създадем унифициран подход, описващ как да взаимодействаме с бази данни, шини и други услуги. Стремяхме се интеграциите да бъдат бързи и безболезнени, а разработчиците да могат да се съсредоточат върху написването на бизнес логиката, а не инфраструктурата – тя вече е готова. Общият репозиторий помага за подобряване на взаимодействието в екипите: когато се използват много подобни вътрешни инфраструктури, по-лесно е да се включиш в процеса на разработка на друг отбор и да обмениш знания.

И защо ни е Open Source?

Искаме да демонстрираме зрелост на експертизата и да получим качествена обратна връзка: човек, който е извън банката, може да донесе нещо от себе си. Освен това ни интересува развитието на практиките за работа с микросервизи и DDD на .NET в индустрията, възможно е някой да иска да вземе определени части от фреймуърка за себе си.

Собствено, ViennaNET

Сега нека разгледаме всичко по-подробно. Целият изходен код сложихме тук.

ViennaNET.WebApi.*

Този набор от библиотеки се състои от „корена“ ViennaNET.WebApi, съдържащ клас-построител за услугата CompanyHostBuilder, и набор от конфигуратори ViennaNET.WebApi.Configurators.*, всеки от които позволява да добавите и конфигурирате определена функционалност в създаваната услуга. Сред конфигураторите можете да намерите свързване на логиране, диагностика, типове аутентификация и авторизация, swagger и т.н.

Тук ViennaNET.WebApi.Runners.* включва предварително конфигурирани строители на услуги. Тези пакети ви позволяват да не се притеснявате всеки път, когато създавате нова услуга, кое конфигуриране трябва да свържете. Те не ограничават функционалността на строителя на услуги.

ViennaNET.Mediator.*

Библиотеки, които позволяват създаването на вътрешен посредник за команди и заявки в рамките на услугата. Този подход намалява броя на DI-инжекциите до една, например, в контролерите. Поради това е възможно добавянето на различни декоратори към заявките, което унифицира тяхната обработка и намалява количеството код.

ViennaNET.Validation

Сборка, съдържаща набор от класове за създаване на валидиращи правила и последователности от тях. Много удобна за реализиране на домейнна валидация, тъй като позволява описването на всяко бизнес условие под формата на прост и отделен правил.

ViennaNET.Redis

Библиотека с обвивки за удобно работа с Redis като in-memory cache.

ViennaNET.Specifications

Сборка, съдържаща класове, реализиращи шаблона „Спецификация”.

Това не е всичко, което имаме в нашия комплект. Останалото можете да видите в хранилището на GitHub. Планираме скоро да пуснем нашите библиотеки за работа с бази данни с отворен код.

Благодарим за вниманието, очакваме вашите коментари и pull request-и.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster