Како направити било који НодеЈС Апп Сервер без везе

Надам се да волите Серверлесс колико и ја јер је ово још један пост на ту тему.

Ако сада говоримо о једноставном РЕСТ АПИ-у без сервера, ваше подешавање је сасвим очигледно на АВС: Ламбда + АПИ Гатеваи.

Али како је са другим (микро) услугама које ваш бацккенд може имати? Знате, није најбоља идеја сву своју апликацијску шифру ставити у једну монолитну АВС Ламбда функцију.

Изазов

Желимо лако да применимо апликационе модуле као микросервер без сервера, који такође морају међусобно да комуницирају. Пожељно је да комуникација између служби треба да буде регулисана неком врстом АЦЛ-а.

Покушај 1. Гатеваи АПИ

Ово је прва мисао коју сам имао када сам покушавао да решим проблем: само изложите све микросервисе путем АПИ Гатеваи-а. Проблем је ... Направљени АПИ-ји су јавни.

Зашто је то проблем? На пример, не желимо да имамо услугу обрачуна за излагање целом свету, чак и ако је приступ ограничен коришћењем неке ауторизације.

Па, АПИ можете учинити приватним, али сигурносне политике су прилично ограничене:

Можете да користите АПИ ресурсе за приступ гатеваи-у да бисте омогућили да се безбедно позива ваш АПИ:
* корисници са одређеног АВС налога
* специфицирани извори ИП адресе или блокови ЦИДР
* одређене виртуелне приватне облаке (ВПЦ) или ВПЦ крајње тачке (на било ком рачуну)

То чини прилично проблематичном контролом комуникације између таквих сервиса. Једини начин да се то постигне је стављање услуга у одвојене ВПЦ-ове, превише посла.

Покушај 2. Ламбда

Зашто једноставно не ставимо сваку микросервис у засебну АВС Ламбда? Да ли ће то решити проблем?

Да, у ствари ће то бити микросервис без сервера, и моћи ћете да користите ИАМ смернице за подешавање приступа између услуга, али ... Није „лако“.

Знам да је у данашње време сасвим нормално да има малу функцију као јединице за распоређивање. А у случају када ваша услуга има више од једне крајње тачке / метода / функције, сматра се у реду размештати је као више Ламбда.

Разумијем његове предности, али жртвујете лакоћу одржавања и развоја. Такође, заиста не волим идеју да сервис буде распоређен као скуп Ламбда функција. Замислите, неколико засебних функција које се баве наплатом? То више није ограничен контекст. Иако постоје случајеви гдје таква прецизност може бити корисна, али то је риједак случај.

Покушај 3. Масна ламбда

Можемо ли заиста распоредити скуп крајњих тачака као јединствена Ламбда (без употребе АПИ-ја Гатеваи, наравно)?

Да смо то урадили, добили бисмо све предности претходне опције, али такође бисмо могли да одаберемо прецизност наших јединица за размештање.

Желим сљедеће: сваки имплементирани сервис требао би бити једноставан, обичан стари ЈС објект с методама. Ово је прилично невиђено постићи додавањем неколико линија кода лепка између вашег објекта и АВС Ламбда.

Ево моје имплементације тога: авс-рпц. Овај нодејс модул открива ламбдаХандлер функцију, где само просљеђујете објект, и аутоматски је изложен свима који имају приступ Ламбда:

импорт {ламбдаХандлер} из 'авс-рпц';
импорт {ТестСервицеИмпл} из './ТестСервицеИмпл';
// ово је ваша јединица за примену
// ово је оно што ви специфицирате као функцију за руковање Ламбде
екпорт цонст хандлер = ламбдаХандлер (нови ТестСервицеИмпл ());

Сада можете само разместити „хандлер“ као АВС Ламбда. Ево како се позивате на његове методе:

импорт {ТестСервице} из './ТестСервице';
цонст цлиент = чекајте цреатеЦлиент <ТестСервице> ("ЛамбдаНаме", "тест");
цонсоле.лог (чекајте цлиент.тест ());

Имајте на уму да да бисте могли генерирати методе за објект клијента, морате проћи све називе метода цреатеЦлиент, као што смо то радили у примјеру.

Ово је потребно јер ЈС нема никакве податке о извођењу о ТипеСцрипт интерфејсима. Могао бих то имплементирати користећи апстрактне часове, али не свиђају ми се ¯ \ _ (ツ) _ / ¯.

Бонус! Можете покренути све локално!

Верујем да је врло важно да вам локално развојно окружење буде што угодније. Због тога сам такође додао могућност покретања услуге и клијента локално, без икаквог распоређивања на АВС (погледајте функције рунСервице и цреатеЦлиент). На пример, погледајте спремиште на ГитХуб-у.

Резиме

Ово је врло лако изгубити се на услугама које нуде провајдери облака и прекомерно подесити вашу инфраструктуру.

Увек бирам најједноставније и најексплицитније решење које могу смислити. Такође, увек се сетите да се многе технике и праксе могу поново употребити са других платформи (идеја масне НодеЈС Ламбда инспирисана је такозваним стакленкама за масти из света Јава).

Ако вам се свидела ова тема, погледајте и ове:

  • Морате научити како направити најбољу архитектуру без сервера
  • Како створити бесплатни ЦИ / ЦД цјевовод без сервера: 3 једноставна примера
  • Како једноставно копирати ДинамоДБ у свим регијама
  • Како направити мултирегионалну апликацију (и платити нула)
  • Укључите било који Јава Веб Апп Сервер без сервера

Коментари, лајкови и дељења веома су цењени. Живели!