Чӣ тавр як барномаи NodeJS-ро бе сервер созед

Умедворам, ки шумо Serverless-ро мисли ман дӯст медоред, зеро ин як навиштаи дигар дар ҳамин мавзӯъ аст.

Агар ин як REST API-и бидуни сервери оддӣ бошад, сабти шумо дар AWS: Lambda + API Gateway хеле аён аст.

Аммо чӣ гуна дар бораи хидматҳои дигар (микро) пуштибонии шумо метавонад дошта бошад? Шумо медонед, ки бастани ҳамаи рамзҳои дархости шумо ба як функсияи AWS Lambda монолитӣ идеяи беҳтарин нест.

Мушкилот

Мо мехоҳем, ки модулҳои барномаро танҳо ҳамчун хидматрасонии бидуни сервер пешниҳод кунем, ки онҳо низ бояд бо ҳам иртибот дошта бошанд. Муоширати байни хидматҳо бояд беҳтараш бо як намуди ACL танзим карда шавад.

Кӯшиши 1. API Gateway

Ин аввалин фикре буд, ки ман ҳангоми ҳалли мушкилот доштам: танҳо тамоми микросервисҳоро тавассути API Gateway фош кунед. Масъала дар он аст ... API-ҳое, ки сохта мешаванд, ҷамъиятӣ мебошанд.

Чаро ин мушкилот аст? Масалан, мо намехоҳем, ки хидмати биллингӣ дар ягон нуқтаи ҷаҳон дастрас бошад, ҳатто агар дастрасӣ бо иҷозат маҳдуд карда шавад.

Хуб, шумо метавонед API-ро хусусӣ кунед, аммо дастурҳои амниятӣ хеле маҳдуданд:

Шумо метавонед API Gateway Policies Resource Politics -ро истифода баред, то ки API-и шуморо бо роҳи бехатар даъват кунад:
* Истифодабарандаи ҳисоби мушаххаси AWS * Диапазони суроғаи IP-и сарчашма ё блокҳои CIDR * Абрҳои мушаххаси виртуалии мушаххас (VPC) ё нуқтаҳои охири VPC (дар ҳама гуна ҳисобҳо)

Ин назорати алоқаи байни чунин хидматҳоро хеле мушкил мекунад. Ягона роҳи ин кор ин ҷо гузоштани хидматҳо ба VPC-ҳои алоҳида мебошад, ки ин кори аз ҳад зиёд аст.

Озмоиши 2. Ламбда

Чаро мо танҳо ҳар як микросервисро дар AWS Lambda алоҳида ҷойгир намекунем? Оё ин мушкилотро ҳал мекунад?

Бале, ин дар ҳақиқат як микросервиси бидуни сервер аст ва шумо метавонед қоидаҳои IAM -ро барои беҳтар кардани дастрасии байнихизматӣ истифода баред. Аммо, ин "осон" нест.

Ман медонам, ки имрӯзҳо нақши ночизе ҳамчун як воҳиди расонидан комилан муқаррарӣ аст. Дар ҳолате, ки хидмати шумо зиёда аз як нуқтаи ниҳоӣ / метод / функсия дошта бошад, онро ҳамчун ламбаҳои сершумор пешниҳод кардан хуб аст.

Ман манфиатҳоро мефаҳмам, аммо шумо осонии нигоҳдорӣ ва рушдро қурбон мекунед. Ғайр аз ин, ман аслан идеяи доштани хидматро ҳамчун маҷмӯи функсияҳои Lambda фош намекунам. Тасаввур кунед, ки якчанд функсияҳои алоҳидае, ки бо биллинг сарукор доранд? Ин дигар як контексти маҳдуд нест. Дар ҳоле ки ҳолатҳое ҳастанд, ки чунин донача метавонад муфид бошад, ин як ҳолати нодир аст.

Кӯшиш кунед, ки 3. Lambda фарбеҳ

Оё мо воқеан метавонем як қатор нуқтаҳои охиринро ҳамчун як Lambda (албатта бидуни шлюз API) пешниҳод кунем?

Агар мо ин корро карда метавонистем, ҳамаи бартариҳои варианти қаблиро мегирифтем, аммо мо метавонем донача будани қисмҳои ҷойгиркунии худро низ интихоб мекардем.

Ин аст он чизе, ки ман дидан мехоҳам: Ҳар як хидмате, ки шумо метавонед амалӣ кунед, бояд як объекти кӯҳнаи JS бо усулҳо бошад. Инро бо илова кардани якчанд сатри коди ширеше дар байни объекти худ ва AWS Lambda иҷро кардан хеле осон аст.

Ин аст татбиқи ман аз он: aws-rpc. Ин модули nodejs функсияи lambdaHandler -ро, ки дар он шумо танҳо як объектро мегузаронед, ошкор мекунад ва он ба таври худкор дастраси ҳамаи корбароне мегардад, ки метавонанд ба лямбда дастрасӣ пайдо кунанд:

воридоти {lambdaHandler} аз 'aws-rpc'; Ворид кардани {TestServiceImpl} аз './TestServiceImpl';
// ин воҳиди таҳририи шумо // ин аст он чизе, ки шумо ҳамчун функсияи коркардкунандаи лямбда содироти const constler = lambdaHandler (new TestServiceImpl ()) муайян мекунед;

Акнун шумо метавонед танҳо "коркардкунанда" -ро ҳамчун AWS Lambda пешниҳод кунед. Чӣ гуна усулҳоро даъват кардан мумкин аст:

Ворид кардани {TestService} аз './TestService';
const муштарӣ = барои createClient интизор шавед ("LambdaName", "test"); console.log (мунтазир шавед client.test ());

Илтимос дар хотир гиред, ки барои тавлиди усулҳо барои объекти дӯкони муштарӣ, шумо бояд ҳамаи номҳои методро барои createClient, тавре ки дар мисол ҷойгир аст, гузаред.

Ин зарур аст, зеро JS дар бораи интерфейсҳои TypeScript маълумоти вақти корӣ надорад. Ман метавонистам онро бо дарсҳои реферат татбиқ кунам, аммо ба ман don't \ _ (ツ) _ / ¯ маъқул нест.

Бонус! Шумо метавонед ҳамаашро ба таври маҳаллӣ иҷро кунед!

Ман фикр мекунам хеле муҳим аст, ки муҳити рушди маҳаллии шумо то ҳадди имкон бароҳат бошад. Аз ин сабаб, ман инчунин қобилияти пешбурди хидмат ва муштариро дар дохили кишвар бе пешниҳоди чизе барои AWS илова кардам (нигаред ба функсияҳои runService ва createClient). Шумо метавонед намунаҳоро дар анбори GitHub пайдо кунед.

Хулоса

Вақте ки шумо дар хидматҳое, ки провайдерҳои абр пешниҳод мекунанд ва инфрасохтори шуморо таъмир мекунанд, гум кардан хеле осон аст.

Ман ҳамеша соддатарин ва возеҳтарин роҳи ҳалли фикрро интихоб мекунам. Ғайр аз он, ҳамеша дар хотир дошта бошед, ки бисёр усулҳо ва таҷрибаҳоро аз дигар платформаҳо истифода бурдан мумкин аст (ғояи NodeJS Lambda далер аз айнакҳои ҷасури ба ном ҷаҳони Java илҳом гирифта шудааст).

Агар ин мавзӯъ ба шумо писанд омада бошад, инчунин чизҳои зеринро хонед:

  • Шумо бояд чӣ гуна сохтани беҳтарин меъмории бе серверро омӯзед
  • Чӣ гуна метавон як лӯлаи CI / CD -и бе сервери ройгон сохт: 3 Мисоли оддӣ
  • Нусхаи осони DynamoDB дар минтақаҳо
  • Чӣ гуна як барномаи бисёрҷониба сохтан мумкин аст (ва сифрро пардохт кунед)
  • Java Web App-ро бе сервер созед

Шарҳҳо, лайкҳо ва саҳмҳо хеле қадр карда мешаванд. Сарчаппа!