NPM Workspaces & Microservices

NPM-da MicroServices yordamida MonoRepos-ni qanday qilish kerak?

Repozitoriy -›https://github.com/RaulGF92/NpmWorkspaceMicroServices

Kirish

Ushbu haftalar mening ishimda biz MonoRepos va bu bizning muammolarimizga qanday yechim bo'lishi mumkinligi haqida gapiramiz.

Biz ulkan MicroService buluti bilan ishlayapmiz va ba'zida har qanday o'zgarish bizning ishlab chiquvchilar oqimiga katta ta'sir ko'rsatadiUpVersion -› PullRequest -› CI/CDbu minimal o'zgarishlarga olib keladi. katta harakat (va bu vaqt o'tishi bilan yo'q bo'lib ketishi mumkin bo'lgan ko'rinadi)

MonoRepo buning yechimi bo'lishi mumkin, chunki:

  • Barcha ishlab chiquvchilar barcha Microsni bilishlari mumkin edi
  • Biz barcha loyihalarda loyiha konfiguratsiyasini baham ko'ramiz
  • Biz ko'plab loyihalar bo'yicha "katta o'zgarishlar" qilishimiz mumkin

Lekinhammasining kamchiliklari bor va MonoRepoyondashuvi MicroServices ko'rinishi o'rniga monolitik loyiha ko'rinishiga ega bo'lgan, bu mening kompaniyam falsafamga juda singdirilgan, ammo, Ikkala narsani ham o'zini tutishi mumkinmi? MonoReposning yaxshiligi va MicroServicesning yaxshiligi? Javob ha,Lekin siz biroz kurashasiz, bu yerda sizda turli xil dasturiy yechimlar mavjud:

  • NX.js: bu JS-da mono-repo qilish uchun eng yaxshisi generatorlarni o'z ichiga oladi va siz MicroServices-da ko'p kuch sarflamasdan joylashtirishingiz mumkin, agar siz unga rioya qilmasangiz, bu yechim muammosi juda qattiq. shaxsiy generatorlaringiz va skriptlaringizni yaratishni boshlashingiz kerak bo'lgan tuzilma (shuningdek, barcha bilimlarni ishlab chiquvchilar jamoasiga o'tkazing)

Men ushbu blogni NX.js da micro
https://blog.nrwl.io/nx-and-node-microservices-b6df3cd1bad6 bilan tanishtirish uchun juda foydali bo'lishini tavsiya qilaman.

  • Lerna.js:Agar sizda shaxsiy NPM repo bo'lsa, Lerna yaxshi yechim bo'lishi mumkin, Lerna har bir Micro-ni NPM-ga yuklaydi va ularni docker-ga yuklaydi, siz MS kutubxonangizni DockerFile-ga o'rnatishingiz va keyin ishga tushirishingiz kerak. , men uchun yechim bo'lishi mumkin, lekin juda qiyin

Men uchun bu blog Lerna qanday ishlashini tushunishga yordam beradi "https://semaphoreci.com/blog/javascript-monorepos-lerna"

  • TurboRepo/NPM ish maydoni:Men uchun TurboRepo eng yaxshi yechimdir, chunki bu eng yaxshisi emas (turboReponi tushunish uchun siz NPM ish maydonini tushunishingiz kerak), lekin sizning tuzilmangiz uchun ochiq va siz faqat foydalanishingiz kerak. NPM ish maydoni (Lernaning yangi versiyasi ham bundan foydalanadi). TurboRepo sizning ishlashingizni optimallashtiradi (bir xil ish maydoni ostidagi turli loyihalar bilan) va qayta o'chirmaslik uchun keshlarni yaratadi.
  • foydasiz buyruqlar.

NPM Workspace GetStarted

Quyidagi NPM hujjatlari sizga NPM ish maydoni menikidan yaxshiroq ishlashini yaxshiroq tushuntirishi mumkin, men MicroServices-da foydalanish uchun ilovani tushuntiraman.

https://docs.npmjs.com/cli/v7/using-npm/workspaces

Mening barcha tuzilmalarim va loyihalarim Repoda, agar xohlasangiz, ko'rib chiqing va u ko'proq xususiyatlarga ega bo'ladi.

Biz ushbu tuzilishga amal qiladigan ish maydonini yaratmoqchimiz

MyProject
  package.json
  package-lock.json
  applications
  | (Microservices)
  libs
  | (common projects)

Bizda faqat bitta qoida bor! Bitta noyob qoida! (Bu qoida kelajakdagi CI/CDga ta'sir qiladi)

Ilova loyihalari HECH QACHON boshqa loyihalarni ilovalar jildidan, faqat libs jildidan import qilmaydi

MicroService-ni o'rnating

Biz User-Service deb nomlangan yangi MicroService-ni o'rnatmoqchimiz (mening amaliyotimni repomda ko'rishingiz mumkin)

npm init -w ./applications/user-service

Shuningdek, biz umumiy kutubxona yaratmoqchimiz

npm init -w ./libs/hello-i18n

Endi struktura quyidagicha ko'rinadi:

MyProject
  package.json
  package-lock.json
  applications
  | (Microservices)
    user-service
      package.json
  |
  libs
  | (common projects)
    hello-i18n
      package.json
  |

Qoʻshimcha maʼlumotni maqolaning pastki qismida, “NPM ish maydoni qanday ishlaydi” boʻlimida koʻrishingiz mumkin.

Endi biz barcha loyihalarga kerak bo'lgandan ko'ra minimal o'rnatishni o'rnatmoqchimiz, mening holimda biz bajargan ildiz papkasida Express.js, TypeScript (repoda qarang) va winston.js bo'ladi.

npm install --workspaces express winston mocha chai

Bu har bir loyihaga bog'liqliklarni o'rnatadi va bu muhim asosiy nuqta NPM ish joylari ota-onasi o'z farzandlari bilan bog'liqlikni baham ko'rmaydi(bu haqiqatan ham haqiqat emas, lekin bu haqiqiy tartibsizlik va bo'lishi mumkin. hozircha bu mumkin emas deb ayting)

Ushbu blogni yaratish jarayonida men ota-onalarning har bir bola paketidagi turli paketlarni sinxronlash qobiliyatini berish uchun Gulp yoki Grunt protsessoridan foydalanishimiz mumkinligini angladim.

Boshqa loyihada muayyan qaramlikni o'rnatish uchun -w buyrug'i yordamida o'rnatishingiz mumkin:

npm install axios -w user-service

MicroService-ni qanday o'rnatish kerak?

Biz shu erdamiz va biz bunga javob berishga harakat qilamiz, g'oya har bir dastur yoki mikroservis papkasi uchun DockerFile yaratishdir, bu DockerFile-ga biz butun monolitni qo'shmoqchimiz, lekin. , biz ushbu misoldagi kabi maqsadli ilovani va butun lib jildini qo'shmoqchimiz:

DockerFile ichida biz har bir ish maydoni elementining barcha bog'liqliklarini o'rnatamiz va barcha loyihalarni quramiz (agar matn terish monorepo bo'lsa), bu skriptlar asosiy papkada joylashgan va — if-present deb nomlangan bayroqni o'z ichiga oladi. va ular bizga har bir replikada butun ish maydonini ajratmaslik qobiliyatini beradi, bu ajoyib!

"scripts": {
  "build-all": "npm run build --workspaces --if-present",
  "install-all": "npm install --workspaces  --if-present",
  "lint-all": "npm run lint --workspaces --if-present",
  "lint-fix-all": "npm run lint-fix --workspaces --if-present"
},

Va shu nuqtada, biz ushbu yechim haqida yaratilgan noyob qoidani hal qildik:

Ilova loyihalari HECH QACHON boshqa loyihalarni ilovalar jildidan, faqat libs jildidan import qilmaydi

Buning sababi, biz mikroservisni yaratganimizda, dastur loyihasi boshqa dasturga kirish huquqiga ega bo'lmaydi, lekin ha lib jildiga (bu yechim maxsus moslashtirish uchun o'zgartirilishi mumkin)

Endi biz buni o'rnatmoqchi bo'lsak, biz docker-compose yoki Kubernetes-dan foydalanishimiz mumkin, bu ildiz papkasida ajratilgan docker-compose misoli:

Bu ushbu kirishning asosiy maqsadi bo'lishi uchun men bu jarayonni GitHub-da parallel ravishda olib borishim kerak!

NPM ish maydoni qanday ishlaydi?

Agar siz NPM ish maydoni qanday ishlashini bilmoqchi boʻlsangiz, asosiy ildiz papkasi ostida npm oʻrnatishni amalga oshirishingiz kerak boʻlsa, bu yerda NPM har bir boladan package.json ni oʻrnatadi va uni ota-node_modules-ga kiritadi.

Package.json ga kirsak, biz ish maydonini ko'rishimiz mumkin (Ha, men Windowsdan foydalanaman, lekin Unix tizimida teng ishlaydi)

"workspaces": [
    "applications\\user-service",
    "libs\\*"
  ]

Va agar biz biron bir buyruqni berishni istasak, masalan, barcha loyihalarimizni sinab ko'rish, biz ota-onaga yuborishimiz mumkin va ota-ona barcha ish joylarini tanlaydi.

npm run test --workspaces

yoki maxsus loyiha:

npm run test --workspace=user-service