Кантип NodeJS колдонмосун серверсиз кылса болот

Серверсизди мендей жакшы көрөсүз деп үмүттөнөм, анткени бул дагы бир темадагы пост.

Эгер бул жөнөкөй серверсиз REST API болсо, анда сиздин AWS: Lambda + API Gateway орнотуусу айдан ачык.

Бирок сиздин backend башка (микро) кызматтар жөнүндө эмне айтууга болот? Билесизби, бардык колдонмо коддоруңузду монолиттүү AWS Lambda функциясына ороп коюу эң мыкты идея эмес.

Кыйынчылык

Биз колдонмо модулдарын бири-бирибиз менен байланышып турушу керек болгон серверсиз микросервис катары камсыз кылгыбыз келет. Кызматтардын ортосундагы байланыш ACL түрү менен жөнгө салынышы керек.

Аракет 1. API Gateway

Бул көйгөйдү чечүүгө аракет кылганда биринчи ойлонгом: жөн гана API Gateway аркылуу бардык микросервистерди ачыкка чыгарыңыз. Маселе ... жаратылып жаткан API'лер жалпыга ачык.

Эмне деген көйгөй? Мисалы, кирүү уруксаты менен чектелген болсо дагы, эсептешүү кызматы дүйнөнүн каалаган жеринде жеткиликтүү болушун каалабайбыз.

Ооба, сиз API купуя кыла аласыз, бирок коопсуздук эрежелери чектелүү:

API Gateway Resource Policies колдонуп, APIңиздин коопсуздугу менен чакырылышына мүмкүнчүлүк бериңиз:
* Белгилүү бир AWS каттоо эсебинин колдонуучусу * Белгиленген булак IP даректеринин диапазондору же CIDR блоктору * Көрсөтүлгөн виртуалдык жеке булуттар (VPC) же VPC акыркы чекиттери (каалаган эсепте)

Бул мындай кызматтардын ортосундагы байланышты башкарууну бир топ татаалдаштырат. Мунун бирден-бир жолу - кызматтарды өзүнчө VPCлерге жайгаштыруу, бул өтө эле көп жумуш.

Эксперимент 2. Ламбда

Эмне үчүн биз ар бир микросервисти өзүнчө AWS Lambdaга жайгаштырбайбыз? Бул маселе чечилеби?

Ооба, бул чындыгында серверсиз микросервис жана кызматтар аралык жеткиликтүүлүктү оптималдаштыруу үчүн IAM саясаттарын колдонсоңуз болот. Бирок, бул "оңой" эмес.

Бүгүнкү күндө жеткирүү бирдиги катары кичинекей роль ойношу кадимки көрүнүш деп билем. Эгер сиздин кызматта бирден ашык чекити / ыкмасы / функциясы бар болсо, аны бир нече лямбда катары берген жакшы.

Мен анын артыкчылыктарын түшүнөм, бирок сиз техникалык тейлөөнү жана өнүгүүнү жеңилдетесиз. Ошондой эле, Lambda функцияларынын жыйындысы катары ачыкка чыккан кызматка ээ болуу идеясы мага жакпайт. Биллинг менен алектенген бир нече өзүнчө функцияларды элестетип көрсөңүз? Бул эми чектелген контекст эмес. Мындай гранулдуулук пайдалуу болушу мүмкүн болгон учурлар бар, бирок бул сейрек учур.

3. семиз Lambda аракет

Биз чындыгында бир эле Lambda катары бир катар акыркы чекиттерди бере алабызбы (албетте, API шлюзу жок)?

Эгер биз муну жасай алсак, анда мурунку варианттын бардык артыкчылыктарын колдонмокпуз, бирок жайгаштыруу бөлүмдөрүнүн гранулдуулугун дагы тандап алмакпыз.

Мен каалаган нерсе: Сиз ишке ашыра турган ар кандай кызмат ыкмалары бар жөнөкөй, эски JS объектиси болушу керек. Бул сиздин объект жана AWS Lambda ортосунда желим кодун бир нече саптарды кошуу менен ишке ашыруу үчүн абдан жеңил болот.

Аны ишке ашыруу: aws-rpc. Бул nodejs модулу lambdaHandler функциясын ачыкка чыгарат, анда сиз бир гана объектти өткөрүп бересиз жана ал lambdaга кире алган бардык колдонуучуларга автоматтык түрдө жеткиликтүү болот:

{lambdaHandler} 'aws-rpc' дан импорттоо; {TestServiceImpl} файлын './TestServiceImpl' дан импорттоо;
// бул сиздин коюу бирдиги // сиз лямбда иштетүүчү функциясы катары көрсөткөн экспорттук const handler = lambdaHandler (жаңы TestServiceImpl ());

Эми сиз жөн гана "иштетүүчүнү" AWS Lambda катары бере аласыз. Методдорду кантип чакырса болот:

{.Sestice 'ден импорттоо {TestService};
const client = createClient күт ("LambdaName", "test"); console.log (client.test () күтүп туруңуз);

Кардардын стуб объектиси үчүн методдорду жаратуу үчүн, баардык методдордун аталыштарын, мисалдагыдай кылып, жаратуу керектигин эске алыңыз.

Бул JS TypeScript интерфейстери жөнүндө иштөө убактысынын маалыматына ээ болбогондуктан керек. Мен аны абстракттуу класстар менен ишке ашырсам болмок, бирок I \ _ (ツ) _ / ¯ жакпайт.

Бонус! Баарын жергиликтүү деңгээлде жасай аласыз!

Сиздин жергиликтүү өнүгүү чөйрөңүз мүмкүн болушунча ыңгайлуу болушу абдан маанилүү деп ойлойм. Ушул себептен, мен AWS үчүн эч нерсе бербестен, кызматты жана кардарды жергиликтүү деңгээлде иштетүү мүмкүнчүлүгүн коштум (runService жана createClient функцияларын караңыз). Мисалдарды GitHub кампасынан таба аласыз.

Кыскача маалымат

Булут провайдерлери сунуш кылган кызматтардан адашып, инфраструктураңызды капиталдык оңдоодон өткөрүп жатканда, аны жасоо абдан оңой.

Мен ар дайым мен ойлогон эң жөнөкөй жана ачык чечимди тандайм. Ошондой эле, көптөгөн ыкмаларды жана тажрыйбаларды башка платформалардан кайрадан колдонсо болоорун эсиңизден чыгарбаңыз (тайманбас NodeJS Lambda идеясы Java дүйнөсүнүн тайманбас көз айнектеринен алынган).

Эгер сизге бул тема жаккан болсо, анда төмөнкүлөрдү да окуңуз:

  • Сиз мыкты серверсиз архитектураны курууну үйрөнүшүңүз керек
  • Акысыз серверсиз CI / CD түтүгүн кантип курса болот: 3 Жөнөкөй мисалдар
  • Аймактар ​​боюнча DynamoDBдин оңой көчүрүлүшү
  • Кантип Көп Аймактык Колдонмону Түзүү (жана Нөл Төлөө)
  • Java Web App Сервиссиз кылыңыз

Комментарийлер, лайктар жана бөлүшүүлөр абдан бааланат. Төмөндө!