ViennaNET: isang hanay ng mga aklatan para sa backend

Kumusta sa lahat!

Kami ay isang komunidad ng mga .NET developer sa Raiffeisenbank at gusto naming pag-usapan ang tungkol sa isang hanay ng mga library ng imprastraktura batay sa .NET Core para sa mabilis na paglikha ng mga microservice na may iisang ecosystem. Dinala nila ito sa Open Source!

ViennaNET: isang hanay ng mga aklatan para sa backend

Ang isang maliit na kasaysayan

Noong unang panahon mayroon kaming isang malaking monolitikong proyekto, na unti-unting naging isang hanay ng mga microservice (mababasa mo ang tungkol sa mga tampok ng prosesong ito sa artikulong ito). Sa proseso, nakatagpo kami ng problema na kapag lumilikha ng mga bagong microservice, madalas naming kailangang kopyahin ang iba't ibang mga solusyon sa imprastraktura - tulad ng pag-set up ng pag-log, pagtatrabaho sa isang database, WCF, atbp. Isang koponan ang nagtrabaho sa proyektong ito, at ang lahat ay nakasanayan na sa ilang itinatag na diskarte sa pagtatrabaho sa imprastraktura. Samakatuwid, pinaghiwalay namin ang karaniwang code sa isang hiwalay na imbakan, binalot ang mga nakolektang aklatan sa mga pakete ng Nuget at inilagay ang mga ito sa aming panloob na imbakan ng Nuget.

Lumipas ang oras, unti-unting nahati ang proyekto, at nagkaroon ng pagnanais na lumikha ng mga bagong module sa panig ng kliyente sa isang modernong balangkas ng JS at patakbuhin ang mga ito sa browser. Nagsimula kaming lumipat mula sa WCF/SOAP patungong REST/HTTP, kaya kailangan namin ng mga bagong library para mabilis na mailunsad ang mga serbisyo batay sa AspNet WebApi. Ang unang bersyon sa .Net Framework 4.5 ay ginawa ng aming arkitekto na halos nakaluhod sa kanyang libreng oras, ngunit sa labas ng kahon ay naging posible na maglunsad ng isang serbisyo na may tatlong linya sa Program.cs na naglalaman ng pahintulot (NTLM), pag-log, Swagger, IoC/DI batay sa Castle Windsor, mga customized na HTTP client na nagpapasa ng iba't ibang header upang magbigay ng end-to-end na pag-log sa buong proyekto. At ang buong bagay na ito ay maaaring higit pang mai-configure nang direkta sa file ng pagsasaayos ng serbisyo.

Gayunpaman, hindi lahat ay maayos: ang library na ito ay naging lubhang hindi nababaluktot sa mga tuntunin ng pagpapakilala ng mga bagong module. Halimbawa, kung kailangan mong magdagdag ng ilang espesyal na middleware, kailangan mong lumikha ng bagong pagpupulong at magmana mula sa batayang klase na nagpapatakbo ng serbisyo, na lubhang hindi maginhawa. Buti na lang at wala masyadong ganoong kaso.

Ang panahon ng Docker at Kubernetes

Dumating na ang panahon na umabot sa amin ang wave ng Docker at Kubernetes, na mahigpit naming binantayan: pagkatapos ng lahat, ito ay isang magandang pagkakataon upang simulan ang paglipat ng higit pa sa mga teknolohiya, sa .Net Core. Nangangahulugan ito na kakailanganin namin ng bagong imprastraktura upang magpatakbo ng mga serbisyo: ang ilang mga aklatan ay lumipat mula sa .Net Framework patungo sa .Net Standard at .Net Core na halos walang pagbabago, ang ilan ay may maliliit na pagpapabuti. Ngunit higit sa lahat gusto kong i-rework ang functionality na nauugnay sa paglulunsad ng mga serbisyo sa AspNet Core.

Ang unang bagay na aming isinasaalang-alang ay isang konsepto na mag-aalis ng pangunahing disbentaha ng nakaraang bersyon: kakulangan ng kakayahang umangkop. Samakatuwid, napagpasyahan na gawin ang buong sistema ng aklatan bilang independyente at modular hangga't maaari at kolektahin ang mga serbisyong kinakailangan para sa functionality bilang isang constructor.

Ang pangunahing layunin ay lumikha ng isang pinag-isang diskarte na naglalarawan kung paano makipag-ugnayan sa mga database, bus at iba pang mga serbisyo. Sinubukan naming gawing mabilis at walang sakit ang mga pagsasama, at maaaring tumutok ang mga developer sa pagsulat ng lohika ng negosyo kaysa sa imprastraktura - handa na ito. Nakakatulong ang isang karaniwang repository na pahusayin ang karanasan ng pakikipag-ugnayan sa loob ng mga team: kapag ginamit ang mga halos katulad na panloob na imprastraktura, mas madaling sumali sa proseso ng pagbuo ng isa pang team at makipagpalitan ng kadalubhasaan.

At bakit kailangan natin ng Open Source?

Gusto naming ipakita ang kapanahunan ng aming kadalubhasaan at makatanggap ng mataas na kalidad na feedback: ang isang tao sa labas ng bangko ay maaaring magdala ng isang bagay sa kanilang sarili. Interesado din kami sa pagbuo ng mga kasanayan para sa pagtatrabaho sa mga microservice at DDD sa .NET sa industriya, marahil ay may gustong pumalit sa ilang bahagi ng framework.

Sa totoo lang, ViennaNET

Ngayon tingnan natin nang mas malapitan. Ang buong source code ay nai-post dito.

ViennaNET.WebApi.*

Ang hanay ng mga aklatan na ito ay binubuo ng "ugat" na ViennaNET.WebApi, na naglalaman ng klase ng tagabuo para sa serbisyo ng CompanyHostBuilder, at isang hanay ng mga configurator na ViennaNET.WebApi.Configurators.*, na bawat isa ay nagbibigay-daan sa iyong magdagdag at mag-configure ng ilang functionality sa nilikha serbisyo. Kabilang sa mga configurator maaari kang makahanap ng mga koneksyon para sa pag-log, diagnostic, pagpapatunay at mga uri ng awtorisasyon, swagger, atbp.

Ang ViennaNET.WebApi.Runners.* ay naglalaman din ng mga paunang na-configure na tagabuo ng serbisyo. Ang mga paketeng ito ay nagbibigay-daan sa iyo na huwag matandaan sa tuwing gagawa ka ng isang bagong serbisyo kung saan ang mga configurator ay kailangang konektado. Gayunpaman, hindi nila nililimitahan ang functionality ng tagabuo ng serbisyo sa anumang paraan.

ViennaNET.Mediator.*

Mga aklatan na nagbibigay-daan sa iyong lumikha ng panloob na intermediary bus para sa mga utos at kahilingan sa loob ng isang serbisyo. Ang diskarte na ito ay nagpapahintulot sa iyo na bawasan ang bilang ng mga DI injection sa isa, halimbawa, sa mga controllers. Dahil dito, maaari kang magdagdag ng iba't ibang mga dekorador sa mga kahilingan, na pinagsasama ang kanilang pagproseso at binabawasan ang dami ng code.

ViennaNET.Pagpapatunay

Isang pagpupulong na naglalaman ng isang hanay ng mga klase para sa paglikha ng mga panuntunan sa pagpapatunay at mga pagkakasunud-sunod mula sa kanila. Ito ay napaka-maginhawa para sa pagpapatupad ng pagpapatunay ng domain, dahil pinapayagan ka nitong ilarawan ang bawat kondisyon ng negosyo sa anyo ng isang simple at hiwalay na panuntunan.

ViennaNET.Redis

Isang library na may mga wrapper para sa maginhawang trabaho sa Redis bilang isang in-memory na cache.

ViennaNET.Specifications

Isang pagpupulong na naglalaman ng mga klase na nagpapatupad ng pattern ng Pagtutukoy.

Hindi lang ito ang nasa set namin. Maaari mong makita ang natitira sa imbakan ng GitHub. Pinaplano naming ilabas ang aming mga aklatan para sa pagtatrabaho sa mga database sa OpenSource sa lalong madaling panahon.

Salamat sa iyong pansin, inaasahan namin ang iyong mga komento at pull request.

Pinagmulan: www.habr.com

Magdagdag ng komento