Spații de lucru și microservicii NPM

Cum se face MonoRepos cu MicroServices în NPM?

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

Introducere

În aceste săptămâni, în munca mea, vorbim despre MonoRepos și despre cum ar putea fi o soluție la problemele noastre.

Lucrăm cu un cloud uriaș MicroService și, uneori, orice modificare generează un impact mare asupra fluxului nostru de dezvoltare deUpVersion -› PullRequest -› CI/CDcare face modificări minime care ar putea avea un efort mare (și asta arată care ar putea dispărea cu timpul)

MonoRepo ar putea fi o soluție pentru aceasta deoarece:

  • Toți dezvoltatorii ar putea cunoaște toate Micro-urile
  • Împărtășim configurațiile de proiect în toate proiectele
  • Am putea face „schimbări masive” în multe proiecte

Dartoți au dezavantaje și abordarea MonoRepoobișnuită are o viziune de proiect Monolitic în loc de o viziune MicroServices, ceva care este foarte impregnat în filosofia companiei mele, dar, S-ar putea comporta ambele lucruri? Bunul MonoRepos și binele MicroServices? Răspunsul este da,Dar vei lupta puțin, aici ai diferite soluții software:

  • NX.js: acestea sunt cele mai bune pentru a face repo mono în JS conține generatoare și puteți implementa în MicroServices fără prea mult efort, problema acelei soluții este prea strictă dacă nu o respectați structura de care aveți nevoie pentru a începe să vă construiți generatoarele și scripturile personale (de asemenea, transmiteți toate aceste cunoștințe echipei de dezvoltatori)

Recomand acest blog foarte util pentru introducerea în NX.js cu micro
https://blog.nrwl.io/nx-and-node-microservices-b6df3cd1bad6

  • Lerna.js:Lerna ar putea fi o soluție bună dacă aveți un depozit NPM privat, Lerna va încărca fiecare Micro în NPM și le va încărca în docker, trebuie să instalați biblioteca MS în DockerFile și apoi să rulați , pentru mine ar putea fi o soluție, dar foarte dificilă

Pentru mine acel blog mă ajută să înțeleg cum funcționează Lerna https://semaphoreci.com/blog/javascript-monorepos-lerna

  • Spațiul de lucru TurboRepo/NPM:Pentru mine, TurboRepo este cea mai bună soluție, nu pentru că este cea mai bună (într-adevăr trebuie să înțelegeți spațiul de lucru NPM pentru a înțelege TurboRepo), ci este deschis structurii dvs. și trebuie doar să utilizați spațiul de lucru NPM (noua versiune a lui Lerna folosește și asta). TurboRepo vă va optimiza execuția (cu proiecte diferite în același spațiu de lucru) și va crea cache-uri pentru a evita reintroducerea
  • comenzi inutile.

NPM Workspace Începeți

Următoarea documentație NPM vă poate explica mai bine cum funcționează spațiul de lucru NPM mai bine decât al meu, voi explica aplicația pentru utilizare în MicroServices

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

Toată structura și proiectele mele sunt în Repo. Aruncă o privire dacă îți place și va avea mai multe caracteristici.

Vom crea un spațiu de lucru care urmează această structură

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

Avem o singură regulă! O singură regulă unică! (Această regulă va avea un impact în viitorul CI/CD)

Proiectele de aplicații NU vor importa NICIODATĂ alte proiecte din dosarul de aplicații, doar din folderul libs

Instalați un MicroService

Vom instala un nou MicroService, numit User-Service (Puteți vedea implementarea mea în depozitul meu)

npm init -w ./applications/user-service

De asemenea, vom crea o bibliotecă comună

npm init -w ./libs/hello-i18n

Acum structura va fi văzută astfel:

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

Puteți vedea mai multe informații în partea de jos a articolului, în partea „Cum funcționează spațiul de lucru NPM”

Acum vom instala instalarea minimă decât este nevoie de toate proiectele, în cazul meu vor fi Express.js, TypeScript (vezi în repo) și winston.js, în folderul rădăcină pe care l-am executat

npm install --workspaces express winston mocha chai

Acest lucru va instala dependențele în fiecare proiect și este un punct cheie important părintele NPM spații de lucru nu împărtășește dependențele cu copiii săi (acesta nu este cu adevărat un fapt adevărat, dar este o adevărată mizerie și ar putea fi grozav pentru moment spune ca nu este posibil)

În timp ce făceam acest blog, mi-am dat seama că am putea folosi procesorul Gulp sau Grunt pentru a ne oferi posibilitatea de a sincroniza diferitele pachete pe care părintele le are în fiecare pachet copil.

Pentru a instala o anumită dependență într-un alt proiect, puteți instala folosind comanda -w:

npm install axios -w user-service

Cum se implementează MicroService?

Acesta este ceea ce suntem aici și vom încerca să răspundem la asta, ideea este să creăm un DockerFile pentru fiecare aplicație sau folder de microserviciu, în acest DockerFile vom adăuga întregul monolitic dar , vom adăuga aplicația țintă și întregul dosar lib, ca în acest exemplu:

În interiorul DockerFile, instalăm toate dependențele fiecărui element de spațiu de lucru și construim toate proiectele (în cazul în care este un monorepo dactilograf), aceste scripturi sunt alocate în folderul părinte și vor conține un flag numit — dacă este prezent și ne oferă posibilitatea de a nu aloca întreg spațiul de lucru în fiecare replică, asta este minunat!

"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"
},

Și cu acest punct, am rezolvat regula unică care a fost creată despre această soluție:

Proiectele de aplicații NU vor importa NICIODATĂ alte proiecte din dosarul de aplicații, doar din folderul libs

Asta pentru că atunci când creăm microserviciul, proiectul aplicației nu va avea acces la o altă aplicație, dar da la folderul lib (acea soluție ar putea fi modificată pentru adaptare personalizată)

Acum, dacă vrem să implementăm acest lucru, am putea folosi docker-compose sau Kubernetes, acesta este un exemplu de docker-compose alocat în folderul rădăcină:

Pentru ca acesta să fie obiectivul principal al acestei intrări, trebuie să paralel cu acest proces în GitHub!

Cum funcționează spațiul de lucru NPM?

Dacă doriți să știți cum funcționează spațiul de lucru NPM, trebuie să faceți o instalare npm în folderul rădăcină părinte, aici NPM va instala pachetul.json de la fiecare copil și îl va injecta în node_modules părinte.

Dacă mergem la package.json, am putea vedea spațiul de lucru (Da, folosesc Windows, dar funcționează în mod egal în sistemul Unix)

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

Și dacă vrem să lansăm orice comandă, de exemplu, testând toate proiectele noastre, am putea introduce părintele și părintele va selecta toate spațiile de lucru

npm run test --workspaces

sau proiect specific:

npm run test --workspace=user-service