Si ta bëni një aplikacion NodeJS pa server

Shpresoj se ju e doni Serverless aq shumë sa unë, pasi ky është një tjetër postim në të njëjtën temë.

Nëse është një RI API i thjeshtë pa server, konfigurimi juaj në AWS: Lambda + API Gateway është mjaft i qartë.

Por, në lidhje me shërbimet e tjera (mikro) që mund të ketë backend-i juaj? Ju e dini, mbështjellja e të gjithë kodit tuaj të aplikimit në një funksion të vetëm monolit AWS Lambda nuk është ideja më e mirë.

Sfida

Ne duam të sigurojmë module të aplikimit thjesht si mikrosherbime pa server që gjithashtu duhet të komunikojnë me njëri-tjetrin. Komunikimi midis shërbimeve duhet të rregullohet nga një lloj ACL.

Përpjekja 1. API Gateway

Ky është mendimi i parë që pata kur përpiqesha të zgjidhja problemin: thjesht ekspozoni të gjitha mikrosherbimet përmes API Gateway. Problemi është ... API-të që po krijohen janë publike.

Pse është problem? Për shembull, ne nuk duam që një shërbim faturimi të jetë i disponueshëm kudo në botë edhe nëse hyrja është e kufizuar nga autorizimi.

Epo, ju mund ta bëni API privat, por udhëzimet e sigurisë janë mjaft të kufizuara:

Ju mund të përdorni Politikat e Burimeve të API Gateway për të lejuar që API juaj të thirret në mënyrë të sigurt nga:
* Përdoruesi i një llogarie specifike AWS * Gama e specifikuar e adresave IP ose blloqet CIDR * Re private private të specifikuara (VPC) ose pikat përfundimtare të VPC (në çdo llogari)

Kjo e bën mjaft të vështirë kontrollimin e komunikimit ndërmjet shërbimeve të tilla. Mënyra e vetme për ta bërë këtë këtu është vendosja e shërbimeve në VPC të ndara, gjë që është shumë punë.

Eksperimenti 2. Lambda

Pse nuk e vendosim secilin mikrosherbim në një AWS Lambda të veçantë? A do ta zgjidhë problemin kjo?

Po, është me të vërtetë një mikservis i pa server, dhe ju mund të përdorni politikat e IAM për të optimizuar hyrjen ndërmjet shërbimeve. Sidoqoftë, kjo nuk është "e lehtë".

Unë e di që është mjaft normale këto ditë të kesh një rol të vogël si njësi e shpërndarjes. Në rast se shërbimi juaj ka më shumë se një pikë fundore / metodë / funksion, është mirë ta siguroni atë si lambdas të shumëfishta.

Unë i kuptoj përfitimet, por ju sakrifikoni lehtësinë e mirëmbajtjes dhe zhvillimit. Gjithashtu, nuk më pëlqen vërtet ideja për të pasur një shërbim të ekspozuar si një grup funksionesh Lambda. Imagjinoni disa funksione të veçanta që kanë të bëjnë me faturimin? Nuk është më një kontekst i kufizuar. Ndërsa ka raste kur një imtësi e tillë mund të jetë e dobishme, është një rast i rrallë.

Provoni 3. Fat Lambda

A mund të sigurojmë në të vërtetë një numër pikash përfundimtare si një Lambda të vetme (natyrisht pa një portë API)?

Nëse do të mund ta bënim këtë, ne do të përfitonim plotësisht nga opsioni i mëparshëm, por gjithashtu mund të zgjidhnim granularitetin e njësive tona të vendosjes.

Ja çfarë dua: Çdo shërbim që mund të zbatoni duhet të jetë një objekt i thjeshtë, i vjetër JS me metoda. Kjo është shumë e lehtë për tu realizuar duke shtuar disa rreshta të kodit ngjitës midis objektit tuaj dhe AWS Lambda.

Këtu është zbatimi im i tij: aws-rpc. Ky modul nodejs ekspozon funksionin lambdaHandler ku kaloni vetëm një objekt dhe automatikisht u vihet në dispozicion të gjithë përdoruesve që mund të hyjnë në lambda:

importoni {lambdaHandler} nga 'aws-rpc'; Importoni {TestServiceImpl} nga './TestServiceImpl';
// kjo është njësia juaj e skenës // kjo është ajo që ju specifikoni si funksioni i mbajtësit të lambda eksport const const handler = lambdaHandler (i ri TestServiceImpl ());

Tani thjesht mund të siguroni "mbajtësin" si AWS Lambda. Si t'i quani metodat:

Importoni {TestService} nga './TestService';
klienti const = prisni për të krijuarClient ("Emri Lambda", "provë"); console.log (prisni për klientin.test ());

Ju lutemi vini re se për të qenë në gjendje të gjeneroni metoda për objektin e cungut të klientit, duhet të kaloni të gjithë emrat e metodave në createClient si në shembull.

Kjo është e nevojshme sepse JS nuk ka informacion gjatë ekzekutimit në lidhje me ndërfaqet TypeScript. Mund ta zbatoj me klasa abstrakte, por nuk më pëlqen ¯ \ _ (ツ) _ /.

Bonus! Ju mund t'i bëni të gjitha në nivel lokal!

Unë mendoj se është shumë e rëndësishme që mjedisi juaj lokal i zhvillimit të jetë sa më komod që të jetë e mundur. Për këtë arsye, unë gjithashtu kam shtuar aftësinë për të ekzekutuar shërbimin dhe klientin në vend pa pasur nevojë të siguroj asgjë për AWS (shih funksionet runService dhe createClient). Shembuj mund t’i gjeni në depon e GitHub.

Përmbledhje

Veryshtë shumë e lehtë për ta bërë kur humbet në shërbimet që ofrojnë ofruesit e reve dhe riparojnë infrastrukturën tënde.

Unë gjithmonë zgjedh zgjidhjen më të thjeshtë dhe më të qartë që mund të mendoj. Gjithashtu, gjithmonë mbani në mend se shumë teknika dhe praktika mund të ripërdoren nga platformat e tjera (ideja e yndyrës NodeJS Lambda është e frymëzuar nga të ashtuquajturat syze dhjami nga bota Java).

Nëse ju pëlqeu kjo temë, lexoni edhe më poshtë:

  • Ju duhet të mësoni se si të ndërtoni arkitekturën më të mirë pa server
  • Si të ndërtojmë një tubacion falas pa server CI / CD: 3 shembuj të thjeshtë
  • Kopjimi i lehtë i DynamoDB nëpër rajone
  • Si të krijoni një aplikacion multi-rajonal (dhe të paguajnë zero)
  • Bëni Java Web App pa server

Komentet, pëlqimet dhe shpërndarjet vlerësohen shumë. Fund lart!