Skip to main content

One post tagged with "architecture"

View All Tags

Nx ve NestJs Kullanarak Monorepo Y├Ânetimi

Isik

Isik

Backend Team Lead @ vivoo

Nx monorepo y├Ânetim arac─▒, Nest.js Nodejs framework├╝ Nx, Node.js tabanl─▒ front end ve backend uygulamalar─▒n─▒ ve pluginleriyle beraber di─čer ortamlar─▒ da destekleyebilen(├Ârne─čin nx-go ile golang) bir monorepo y├Ânetim arac─▒d─▒r.

├ľncelikle monorepodan bahsedelim, monorepo nedir? Monorepo isminden de anla┼č─▒ld─▒─č─▒ gibi projenin t├╝m kaynak kodlar─▒ ve assetlerinin tek bir repoda topland─▒─č─▒ bir proje repository y├Ânetim stratejisidir. En bilindik ┼čirketlerden olan Google, bu yakla┼č─▒m─▒ benimseyerek milyarlarca sat─▒r kodu tek bir repoda tutuyor. Detaylar i├žin: https://dl.acm.org/doi/fullHtml/10.1145/2854146

Monolith bir uygulama tek bir repoda da y├Ânetilebilir, birden fazla repoya da b├Âl├╝nebilir. Benzer ┼čekilde microservislerden olu┼čan ├žoklu uygulamalar tek repoda yani bu yaz─▒m─▒zda ge├žen monorepo olarak da y├Ânetilebilir kendi multi repolar─▒na da b├Âl├╝mlenebilir.

Biz vivooÔÇÖda farkl─▒ b├Âl├╝mler/projeler i├žin farkl─▒ stratejiler izlesek de birazdan bahsedece─čim backend/api i├žin monorepo y├Ânetim arac─▒ olan nxÔÇÖi kullanarak microservisleri y├Ânetiyoruz.

Monorepo kullanarak sa─člad─▒─č─▒m─▒z belirgin avantajlar ┼ču ┼čekilde: 1- Backend servisleriÔÇŐÔÇöÔÇŐprojeleri aras─▒ndaki kullan─▒lan ortak k├╝t├╝phaneler, ba─č─▒ml─▒l─▒klar ve veri tiplerini kolayca birbirine payla┼čt─▒rabiliyoruz.

2- Tek bir altyap─▒ yap─▒land─▒rmas─▒n─▒ t├╝m servislerde kullanabiliyoruz. Asl─▒nda bu konu monorepolar─▒n derleme s├╝relerinde bir dezavantaj gibi g├Âz├╝kse de nx, docker ve bir ka├ž bash script sayesinde bu dezavantaj olduk├ža azal─▒yor. Sadece affected projeleri paketleyip yay─▒nlayabiliyoruz.

3- Kullan─▒lan dependencyler t├╝m projelerde en g├╝ncel haliyle kal─▒yor. Bir tanesini g├╝ncelledi─čimizde hepsi g├╝ncelleniyor.

Monorepoya ge├žerken dikkat edilmesi gereken ├Ânemli bir ┼čey testlerin yaz─▒l─▒yor olmas─▒. ├ľrne─čin x librarysini kullanan 20 tane uygulama/proje/servis varsa ve bir ki┼či gidip x librarysini g├╝ncelledi─činde o k├╝t├╝phane ya da uygulamalar─▒n baz─▒lar─▒nda testler do─čru yaz─▒lmad─▒ysa ortak kullan─▒lan yerdeki bir de─či┼čiklik bir ├žok serviste yay─▒n s─▒ras─▒nda hataya sebep olabilir. O y├╝zden dikkatli olunmas─▒ gerekiyor.

Neden NX tercih ettik? An itibariyle(2021) a├ž─▒k kaynak kodlu javascript teknolojileri ├╝zerinde y├Ânetim arac─▒ olarak kullanabilecek 2 opsiyon var. Bu opsiyonlar alt─▒nda yarn kullan─▒ld─▒─č─▒ i├žin yarn workspaceÔÇÖi dahil etmedim.

1- Nx

2- Lerna

Lerna olduk├ža g├╝├žl├╝ bir ara├ž olsa da bizim her servisi ayr─▒ca paket olarak tasarlamaya ve bunlar─▒ yay─▒nlamaya de─čil de ┼čirket i├žerisinde uygulama geli┼čtirmeyi daha efektif hale getirmeye ihtiyac─▒m─▒z vard─▒. GoogleÔÇÖ─▒n yakla┼č─▒mlar─▒n─▒ benimseyerek geli┼čtirilen Nx, LernaÔÇÖdan farkl─▒ olarak t├╝m proje i├žin tek bir package.json sa─čl─▒yor. LernaÔÇÖda her projenin kendi package.jsonÔÇÖ─▒ varken nxÔÇÖde t├╝m dependencyler tek bir yerden y├Ânetiliyor. NxÔÇÖde istenirse yarn workspace kullanarak bunu ├žoklu paket sistemine ├ževirmek m├╝mk├╝n olsa da pratik olarak ├Ânerilmiyor. GoogleÔÇÖ─▒n yakla┼č─▒m─▒ burada baz al─▒nm─▒┼č. https://github.com/nrwl/nx/issues/1777 bu issueÔÇÖdan ilgili yaz─▒┼čmalar─▒ okuyabilirsiniz. LernaÔÇÖdan NxÔÇÖ ge├žmek ile alakal─▒ kurucular─▒ndan bir Victor SavkinÔÇÖin yazd─▒─č─▒ bir blog var detaylar─▒ buradan okuyabilirsiniz. https://blog.nrwl.io/why-you-should-switch-from-lerna-to-nx-463bcaf6821

NxÔÇÖin ├Âne ├ž─▒kan ├Âzelliklerine biraz daha bakal─▒m:

Dependency Graph: Nx ile proje grafi─čindeki d├╝─č├╝mler workspace.json i├žinde tan─▒mlan─▒yor. D├╝─č├╝mler aras─▒ndaki ba─č─▒ml─▒l─▒klar─▒ nx kendi ba┼č─▒na halletse de manuel olarak tan─▒mlayabiliyoruz. Ayr─▒ca ├Ânceden tan─▒mlanm─▒┼č grafi─či ├Ânbelle─če al─▒p yaln─▒zca de─či┼čtirdi─činiz dosyalar─▒ yeniden analiz ediyor. Affected Commands: Nx ile ilgili projeyi, ├žoklu projeleri ve t├╝m projeleri ├žal─▒┼čt─▒rmak d─▒┼č─▒nda yaln─▒zca de─či┼čen ve bu de─či┼čikliklere ba─čl─▒ olan uygulamalar─▒ test etme, build etme imkan─▒m─▒z var. ─░lgili merge/pull request ile target ve base commit aras─▒ndaki farka bak─▒p sadece etkilenen projeleri ├žal─▒┼čt─▒rabiliyoruz. Computation Hashing and Caching: Nx ilgili bir g├Ârevi ├žal─▒┼čt─▒rken task s─▒ras─▒n─▒ kontrol eder ve ├žal─▒┼čt─▒rd─▒─č─▒ her g├Ârevi hashler. E─čer ilgili g├Ârev daha ├Ânce ├žal─▒┼čt─▒r─▒ld─▒ysa yani hash cacheÔÇÖde mevcutsa ilgili i┼čin ├ž─▒kt─▒lar─▒n─▒ h─▒zl─▒ bir ┼čekilde yerine getirir. Bunu yaparken local ya da cloud kullan─▒labilir. Distributed Task Execution: NxÔÇÖin komutlar─▒n─▒ NX Cloud kullanarak farkl─▒ makinelerde ayn─▒ anda ├žal─▒┼čt─▒rabilirsiniz. Nx Generators: Nx generatorler ile projemizde kullan─▒lan ve tekrar eden bir ├žok g├Ârevi ve yap─▒lar─▒ ├Âzelle┼čtirerek otomatikle┼čtirebiliyoruz. ├ľrne─čin s├╝rekli kulland─▒─č─▒m─▒z bir dosya yap─▒s─▒ varsa onu olu┼čturmas─▒n─▒ sa─člayan bir generator yazabiliriz. ├ľyleyse hadi NxÔÇÖi sistemimize kurup nest js ile bir uygulama aya─ča kald─▒ral─▒m. ─░kinci b├Âl├╝mde ise bu uygulamaya yeni bir uygulama ekleyip build, test ve deploy s├╝re├žlerine bakal─▒m.

ÔÇőÔÇőnpm install -g nx

npx create-nx-workspaceÔÇŐÔÇöÔÇŐpreset=nest

Nx cli

nx workspace

Vs code ile ilgili projeyi a├ž─▒p structereÔÇÖa bakal─▒m:

project_structure_architecture

Nx-NestJs CLI ile olu┼čturulmu┼č uygulama dosya dizini Nx ve Nest CLI sayesinde https://nx.dev/l/n/nest/overview buradaki d├Âk├╝manda bulabilece─činiz yard─▒mc─▒ commandler i┼čleri olduk├ža h─▒zland─▒r─▒yor.(not: yarn add -D @nrwl/nest ile nesti eklemeyi unutmayal─▒m)

Bir sonraki b├Âl├╝mde Nx kullanarak birden ├žok uygulaman─▒n test, build ve deploy s├╝re├žlerini anlat─▒p bir ka├ž ├Ârnek yapaca─č─▒z.

Yaz─▒da ve projede eme─či ge├žen ki┼čiler:

Huseyin Isik

Semih Onay