Qanday qilib har qanday NodeJS App-ni serversiz qilish mumkin

Men siz kabi Serversizlarni yaxshi ko'rasiz degan umiddaman, chunki bu boshqa mavzu.

Endi biz oddiy serversiz REST API haqida gapiradigan bo'lsak, sizning sozlashingiz AWS: Lambda + API Gateway-da aniq ko'rinib turibdi.

Xo'sh, sizning orqangizdagi boshqa (mikro) xizmatlar haqida nima deyish mumkin? Bilasizmi, barcha dastur kodini bitta monolit AWS Lambda funktsiyasiga kiritish eng yaxshi g'oya emas.

Muammo

Biz dastur modullarini osonlikcha serversiz mikroservis sifatida joylashtirmoqchimiz, ular ham bir-biri bilan aloqa o'rnatishi kerak. Tercihen, xizmatlar o'rtasidagi aloqa qandaydir ACL tomonidan tartibga solinishi kerak.

Harakat 1. API shlyuzi

Muammoni hal qilmoqchi bo'lganimda bu mening birinchi fikrim: faqat API Gateway orqali barcha mikroservislarni fosh qilish. Muammo shundaki ... Yaratilgan API ochiq.

Nega bu muammo? Masalan, biz qandaydir avtorizatsiya yordamida kirish cheklangan bo'lsa ham, billing xizmati butun dunyoga ta'sirlanishini xohlamaymiz.

Xo'sh, siz API-ni shaxsiy qilishingiz mumkin, ammo xavfsizlik siyosati juda cheklangan:

API Gateway manba siyosatidan foydalanishingiz mumkin, bu sizning API tomonidan xavfsiz ravishda chaqirilishi mumkin:
* belgilangan AWS hisobidan foydalanuvchilar
* belgilangan manzili IP manzili yoki CIDR bloklari
* belgilangan virtual shaxsiy bulutlar (VPCs) yoki VPC so'nggi nuqtalari (har qanday hisobda)

Bu bunday xizmatlar o'rtasidagi aloqalarni boshqarish uchun juda qiyin. Buni bu erda amalga oshirishning yagona usuli - xizmatlarni alohida VPClarga o'rnatish, juda ko'p ish.

Harakat 2. Lambda

Nega biz har bir mikroservisni alohida AWS Lambda-ga joylashtirmaymiz? Bu muammoni hal qiladimi?

Ha, aslida bu serversiz mikroservis bo'ladi va siz xizmatlar o'rtasidagi kirishni sozlash uchun XAM siyosatidan foydalanishingiz mumkin, ammo ... "oson" emas.

Sizningcha, hozirgi vaqtda sizning tarqatish moslamangiz sifatida kichik bir funktsiyaga ega bo'lish bu juda normal holat. Agar sizning xizmatingizda bitta tugash nuqtasi / usul / funktsiyasi ortiq bo'lsa, uni bir nechta Lambdalar sifatida joylashtirish yaxshi bo'ladi.

Men uning afzalliklarini tushunaman, lekin siz parvarishlash va rivojlanishning qulayligini qurbon qilyapsiz. Bundan tashqari, menga Lambda funktsiyalari to'plami sifatida xizmat ko'rsatish g'oyasi yoqmaydi. Tasavvur qiling-a, billing bilan shug'ullanadigan bir nechta alohida funktsiyalarmi? Bu endi chegaralangan kontekst emas. Shunga qaramay, bunday teranlik foydali bo'lishi mumkin bo'lgan holatlar mavjud, ammo bu kamdan-kam holatlar.

Harakat 3. Yog 'Lambda

Haqiqatan ham bitta Lambda sifatida (albatta, API Gateway-dan foydalanmasdan) so'nggi nuqtalarni birlashtira olamizmi?

Agar biz buni amalga oshira olsak, oldingi variantning barcha afzalliklariga ega bo'lamiz, ammo biz tarqatish bo'linmalarining teranligini tanlashimiz mumkin.

Men xohlagan usul quyidagicha: har bir joylashtirilishi mumkin bo'lgan xizmat usullari bo'lgan oddiy oddiy eski JS ob'ekti bo'lishi kerak. Ob'ektingiz va AWS Lambda o'rtasida bir necha qator yopishtiruvchi kodni qo'shish orqali bunga erishish juda oddiy.

Mana mening buni amalga oshirishim: aws-rpc. Ushbu nodejs moduli lambdaHandler funktsiyasini ochib beradi, bu erda siz faqat ob'ektni o'tasiz va u Lambda-ga kira oladigan har kimga avtomatik ravishda ta'sir qiladi:

'aws-rpc' dan {lambdaHandler} ni import qilish;
"TestServiceImpl}" ni "./TestServiceImpl" dan import qilish;
// bu sizning tarqatish bo'limingiz
// bu siz Lambda ishlov berish funktsiyasi sifatida belgilagan narsadir
export const handler = lambdaHandler (yangi TestServiceImpl ());

Endi siz shunchaki "ishlov berish vositalarini" AWS Lambda sifatida ishlatishingiz mumkin. Mana uning usullarini qanday ishlatishingiz:

'./TestService' dan {TestService} ni import qilish;
const client = createClient  kuting ("LambdaName", "test");
console.log (client.test ()) ni kutish;

E'tibor bering, mijoz stub ob'ekti uchun usullarni yaratishi uchun biz misolda ko'rsatganimiz kabi createClient-ga barcha usul nomlarini topshirishingiz kerak.

Buning sababi JS-da TypeScript interfeyslari haqida hech qanday ma'lumot yo'qligi sababli kerak. Men uni mavhum sinflar yordamida amalga oshirishim mumkin edi, lekin menga yoqmadi don’t \ _ (() _ / ¯.

Bonus! Bularning barchasini lokal ravishda ishga tushirishingiz mumkin!

Mahalliy rivojlanish muhiti iloji boricha qulay bo'lishi juda muhim deb o'ylayman. Shuning uchun men AWS-ga hech qanday joylamasdan xizmatni va mijozni mahalliy ravishda boshqarish imkoniyatini qo'shdim (runService va createClient funktsiyalariga qarang). Misollar uchun GitHub-dagi omborga qarang.

Xulosa

Bulutli provayderlar taklif etadigan xizmatlarda yo'qolish va infratuzilmani qayta ishlash juda oson.

Men har doim men o'ylashim mumkin bo'lgan eng oddiy va aniq echimni tanlayman. Bundan tashqari, har doim ko'plab texnikalar va amaliyotlarni boshqa platformalarda qayta ishlatish mumkinligini yodda tuting (semiz NodeJS Lambda g'oyasi Java dunyosidagi yog 'idishlari tomonidan ilhomlangan).

Agar sizga ushbu mavzu yoqqan bo'lsa, quyidagilarni ham tekshirib ko'ring:

  • Siz eng yaxshi serversiz arxitekturani qanday qilishni o'rganishingiz kerak
  • Serversiz CI / CD quvur liniyasini qanday yaratish: 3 oson misollar
  • Qanday qilib DynamoDB-ni mintaqalar bo'ylab osongina ko'paytirish mumkin
  • Qanday qilib ko'p millatli dasturni (va nolni to'lashni) amalga oshirish mumkin
  • Java Web App serverini ishsiz holga keltiring

Sharhlar, yoqtirishlar va ulashishlar yuqori baholanadi. Xursand bo'ling!