Реализация бессерверных функций Node.js с помощью Google Cloud

Опубликовано: 2022-03-11

Создание программного обеспечения не заканчивается написанием хорошего кода. Он завершается, когда программное обеспечение развернуто и способно правильно обрабатывать запросы, а также когда мы можем масштабироваться без ущерба для производительности и затрат на его эксплуатацию.

Вы, вероятно, думаете о том, как у вас есть облачные вычисления, чтобы позаботиться обо всех этих вещах. «Так что же это за новая бессерверная штука, Виньес?»

Бессерверные функции Node.js с использованием Google Cloud

Бессерверные вычисления — это архитектурный стиль, в котором код выполняется на облачной платформе, где нам не нужно беспокоиться о настройке оборудования и программного обеспечения, безопасности, производительности и времени простоя ЦП. Это прогресс облачных вычислений, выходящий за рамки инфраструктуры, которая также абстрагирует программную среду. Это означает, что для запуска кода не требуется никаких настроек.

В случае бессерверной работы ваш стиль работы будет следующим:

  1. Разработайте код.

  2. Загрузите код поставщику услуг.

  3. Настройте триггер (в нашем случае HTTP-запрос).

Наша работа сделана! Теперь провайдер платформы позаботится о входящих запросах и масштабировании.

Введение в бессерверные микросервисы

Бессерверная архитектура часто сочетается с дизайном в стиле микросервисов. Микросервис — это отдельная часть большого программного обеспечения, которое обрабатывает запросы для одного конкретного модуля. Создавая микросервисы, которые могут работать в бессерверной среде, становится проще поддерживать код и ускорять развертывание.

Введение в AWS Lambda и GCF, сравнение

Бессерверную функцию часто называют «серверной частью как услугой» или «функцией как услугой». Количество поставщиков бессерверных вычислений начинает увеличиваться. Тем не менее, некоторые из традиционных крупных игроков также предоставляют бессерверные варианты, такие как AWS Lambda Functions от Amazon Web Services и Google Cloud Functions (GCF), последние из которых, хотя в настоящее время находятся в стадии бета-тестирования, — это то, что я использую. Хотя они работают одинаково, между ними есть несколько важных различий.

АВС Лямбда Облачные функции Google
Языковая поддержка Node.js, Python, С#, Java Node.js
Триггеры DynamoDB, Kinesis, S3, SNS, шлюз API (HTTP), CloudFront и многое другое HTTP, Cloud PubSub, сегмент облачного хранилища
Максимальное время выполнения 300 секунд 540 секунд

В этой статье мы рассмотрим процесс реализации бессерверного развертывания кода с использованием GCF. Облачные функции Google — это легкое решение для асинхронных вычислений, основанное на событиях, которое позволяет создавать небольшие одноцелевые функции, которые реагируют на облачные события без необходимости управлять сервером или средой выполнения.

GCF имеет три возможных реализации, разделенных на основе триггеров.

  1. HTTP-триггер Направляет HTTP-запросы к облачным функциям.

  2. Внутренний триггер Google pub/sub Направляет запросы на публикацию и подписку к облачным функциям

  3. Триггер корзины облачного хранилища Направляет любые изменения, внесенные в корзину хранилища, в облачную функцию

Давайте создадим настройку на основе триггера HTTP с помощью Google Cloud Functions.

Google Cloud Functions не требует дополнительной специальной настройки или установки. GCF гарантирует, что среда узла по умолчанию настроена и готова к выполнению. Когда облачная функция создается с использованием HTTP в качестве триггера, она предоставляет URL-адрес для запуска функции. По сравнению с AWS Lambda, который использует шлюз API в качестве среды для связи с ним, облачные функции Google сразу предоставляют URL-адрес на основе projectID и региона.

Схема Google Cloud Platform — облачные функции и AWS Lambda

Создание бессерверного приложения Node.js

Чтобы сделать наш код исполняемым в GCF, мы должны обернуть код внутри одной единственной функции. GCF будет вызывать эту конкретную функцию всякий раз, когда срабатывает триггер. Возможные способы сделать это загрузка,

  1. Один файл: экспорт функции по умолчанию, которая будет вызывать другие функции в зависимости от запроса.

  2. Несколько файлов: есть файл index.js , требующий всех остальных файлов и экспортирующий функцию по умолчанию в качестве отправной точки.

  3. Несколько файлов: настройте один основной файл в package.json , используя "main": "main.js" в качестве отправной точки.

Подойдет любой из вышеперечисленных способов.

GCF поддерживает определенную версию среды выполнения Node. Убедитесь, что код написан для поддержки этой конкретной версии. На момент создания этого поста GCF поддерживает версию Node v6.11.1.

Чтобы создать функцию, необходимо рассмотреть несколько вариантов.

  1. Память Указывает, сколько памяти необходимо для обработки запроса за одно время выполнения. Определяется в МБ. Для небольшого приложения вполне достаточно 128 МБ, но его можно увеличить до 2 ГБ.

  2. Тайм -аут Тайм-аут, как следует из названия, определяет ожидаемый тайм-аут выполнения кода. После этого код будет убит и остановлен. Любое выполнение после этой точки будет резко остановлено. Максимальное время ожидания составляет 540 секунд.

  3. Выполняемая функция Хотя из основного файла обработчика можно экспортировать более одной функции, нам необходимо настроить одну функцию, которая должна запускаться для обработки запроса. Это позволяет разработчику иметь несколько точек входа на основе метода HTTP/URL.

Чтобы загрузить код, просто скопируйте и вставьте код, чтобы создать функциональный портал. Для более чем одного файла заархивируйте содержимое и загрузите файл. Убедитесь, что в случае ZIP-файла должен быть либо файл index.js , либо файл package.json с упомянутым основным файлом.

Любая зависимость модуля NPM должна быть упомянута в package.json . GCF пытается установить модули, упомянутые в файле package.json , во время первоначальной установки.

Давайте создадим простой обработчик для возврата статуса 200 и некоторого сообщения. Создайте функцию и добавьте в исходный код следующий код.

 exports.httpServer = function httpServer(req, res) { console.log(req); res.status(200).send('Server is working'); } 

Скриншот создаваемой функции

После создания функции откройте предоставленный URL-адрес, чтобы активировать функцию. Он должен ответить следующим образом.

Скриншот вывода браузера "Сервер работает"

Теперь давайте рассмотрим объект req в журналах. Для просмотра журналов GCF предоставляет параметры прямо из консоли. Нажмите на вертикальные точки и откройте опцию журналов.

Скриншот открытия опции журналов

Теперь давайте обновим код для обработки простых маршрутов для /users .

Следующий код используется для обработки простого запроса GET и POST для маршрута /users :

 exports.httpServer = function httpServer(req, res) { const path = req.path; switch(path) { case '/users': handleUsers(req, res); break; default: res.status(200).send('Server is working'); } }; const handleUsers = (req, res) => { if (req.method === 'GET') { res.status(200).send('Listing users...'); } else if (req.method === 'POST') { res.status(201).send('Creating User...') } else { res.status(404); } }

После обновления давайте проверим его в браузере, но на этот раз с /users в конце.

Скриншот вывода браузера "Список пользователей..."

Это круто. Мы создали базовый HTTP-сервер с маршрутизацией.

Операции и отладка

Если бы история заканчивалась кодом, вы бы не исследовали варианты инфраструктуры, такие как бессерверные приложения Node.js. Вот краткое изложение того, как выполнять общие задачи, такие как развертывание и отладка. То, что разработчики Node.js уже делают для других приложений.

Развертывание:

Код для функций можно развернуть четырьмя способами.

  • Скопируйте код и вставьте в консоль

  • Загрузка ZIP-файла

  • Развертывание из корзины облачного хранилища в виде ZIP-файла

  • Развертывание из облачного исходного репозитория

Самый удобный вариант — это, очевидно, деплой из исходного репозитория.

Вызов:

При создании функции Console предоставляет URL-адрес HTTP для запуска функции в следующем формате: https://<region>-<project-id>.cloudfunctions.net/<function-name>

Функция AWS Lambda имеет проблемы с холодным запуском, из-за которых выполнение функции требует дополнительного времени для запуска. После запуска следующие выполнения будут работать нормально. Это начальное дополнительное время пуска называется холодным пуском. Хотя у нас нет официальной документации по GCF, относящейся к этой теме, проблемы с холодным запуском не проявлялись во время нашего тестирования.

Отладка:

GCF интегрируется со службой ведения журналов Stackdriver в Google Cloud. Все журналы консоли и ошибки будут регистрироваться здесь, и это помогает отлаживать код, который уже развернут.

Тестирование:

Консоль предоставляет параметры для проверки функции, передавая JSON в качестве входных данных. Функция будет вызываться с JSON в качестве входных данных, а выходные данные будут отображаться в консоли. Запрос (ввод) и ответ аналогичны среде Express.js и могут быть протестированы во время самого процесса разработки. Если вам нужно освежить знания о тестировании Node.js, ознакомьтесь с Руководством Node.js по фактическому выполнению интеграционных тестов.

Ограничения и следующие шаги

Использование бессерверных функций имеет свои преимущества, а также ограничения.

  • Привязка к поставщику: ограничивает код, который мы пишем, одним конкретным поставщиком услуг. Перенос кода к другому поставщику требует переписывания кода со значительными усилиями по переносу. Поскольку это может быть большой проблемой, мы должны быть очень осторожны при выборе поставщика услуг.

  • Ограничения количества запросов и аппаратных ресурсов. Поставщики часто ограничивают количество параллельных запросов, которые функция будет обрабатывать за раз. Есть ограничения по памяти. Эти типы ограничений можно увеличить, поговорив с провайдером, но они все равно будут существовать.

Облачные функции Google развиваются и улучшаются. Он все еще совершенствуется и часто обновляется, особенно на поддерживаемых языках. Если вы планируете использовать функции Google Cloud, следите за журналами изменений, чтобы избежать критических изменений в реализации.


Дальнейшее чтение в блоге Toptal Engineering:

  • Работа с поддержкой TypeScript и Jest: учебное пособие по AWS SAM