NodeJS қосымшасын серверсіз қалай жасауға болады

Сіз де Serverless-ті мен сияқты жақсы көресіз деп үміттенемін, себебі бұл тақырыптағы тағы бір хабарлама.

Егер бұл қарапайым серверсіз REST API болса, сіздің AWS: Lambda + API шлюзінде орнатуларыңыз анық.

Сізде басқа (микро) қызметтер туралы не айтуға болады? Сіз өзіңіздің барлық қолданба кодтарыңызды жалғыз монолитті AWS Lambda функциясына орау жақсы идея емес екенін білесіз бе.

Қиындық

Біз қолданбалы модульдерді бір-бірімен байланыс орнатуы керек серверсіз микросервис ретінде ұсынғымыз келеді. Қызметтер арасындағы байланыс ACL түрімен реттелуі керек.

Әрекет 1. API шлюзі

Бұл менің ойымды шешуге тырысқан кездегі алғашқы ойым: 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 клиенті = CreateClient күтіңіз («LambdaName», «тест»); console.log (client.test () күтіңіз);

Клиенттің нысанды нысанын құру үшін, мысалда көрсетілгендей, барлық әдіс атауларын жасау керек екенін ескеріңіз.

Бұл қажет, себебі JS-де TypeScript интерфейстері туралы жұмыс уақыты туралы ақпарат жоқ. Мен оны абстрактілі сабақтармен жүзеге асыра алар едім, бірақ ¯ \ _ (ツ) _ / ¯ ұнамайды.

Бонус! Сіз мұның бәрін жергілікті деңгейде жасай аласыз!

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

Қысқаша мазмұны

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

Мен әрдайым ойыма ең қарапайым және айқын шешімді таңдаймын. Сонымен қатар, көптеген техникалар мен тәжірибелерді басқа платформалардан қайта пайдалануға болатындығын әрдайым есте сақтаңыз (батыл NodeJS Lambda идеясы Java әлемінің батыл көзілдірігі деп аталады).

Егер сізге бұл тақырып ұнаған болса, келесіні де оқыңыз:

  • Сізге ең жақсы серверсіз архитектураны құруды үйрену керек
  • Серверсіз CI / CD құбырын қалай құруға болады: 3 қарапайым мысалдар
  • Аймақтар бойынша DynamoDB-ді оңай көшірмелеу
  • Көп аймақтық қосымшаны қалай құруға болады (және нөлдік төлем)
  • Java веб-қосымшасын серверсіз ету

Пікірлер, лайктар және бөлісулер өте жоғары бағаланады. Төменнен жоғары қарай!