Развертывание приложений Node.js в Google App Engine

Введение TL; DR; В этой статье мы собираемся развернуть приложение Node.js на Google App Engine и в процессе посмотреть, как это делается. Это будет пошаговая демонстрация, начиная с настройки нашей среды Google App Engine и заканчивая развертыванием. NB: это руководство требует базового понимания JavaScript, Node.js, MongoDB, NPM и Express.js. Вы можете получить исходный код готового приложения здесь [https://github.com/philipszdavido/_nodejs_gae]. Что такое Google App Engine? Google

Вступление

TL; DR; В этой статье мы собираемся развернуть приложение Node.js на Google App Engine и в процессе посмотреть, как это делается.

Это будет пошаговая демонстрация, начиная с настройки нашей среды Google App Engine и заканчивая развертыванием.

NB : это руководство требует базового понимания JavaScript, Node.js, MongoDB, NPM и Express.js.

Вы можете получить исходный код готового приложения здесь .

Что такое Google App Engine?

Google App Engine, платформа облачных вычислений (PaaS), выпущенная Google 7 апреля 2008 года, написана на C ++, PHP, Node.js и Python.

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

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

Создайте экземпляр Google App Engine (экземпляр 2-го поколения )

Чтобы начать использовать Google App Engine, мы собираемся настроить проект Google Cloud Platform:

  1. Войдите в свою учетную запись Google. Если у вас его еще нет, вам следует зарегистрироваться .
  2. Перейдите на сайт App Engine.
  3. Может появиться диалоговое окно с требованием использовать версию приложения Google Cloud Console: «Использовать приложение» или «Не сейчас». Выбор за вами, но, желательно, нажмите «Не сейчас», чтобы продолжить.
  4. На появившемся экране будут представлены две опции: «Создать» или «Выбрать». Для этого урока мы создаем новый проект, нажмите кнопку «Создать». Если вы превысили максимальное количество ваших проектов GCP, вам следует «Выбрать» проект.
  5. Введите название вашего проекта в текстовое поле «Project name», под текстовым полем будет ваш ID проекта, созданный GCP на основе вашего названия проекта. когда закончите, нажмите кнопку «Создать».
  6. Через несколько секунд появится экран «Выберите место». В раскрывающемся виджете «Выбрать регион» щелкните его, чтобы выбрать предпочтительный регион, затем нажмите «Далее».
  7. На следующем экране появится «Включить биллинг». Нажмите «Настроить биллинг».
  8. Появится модальный диалог, нажмите «Создать платежную учетную запись».
  9. Введите предпочтительное имя учетной записи в следующем окне или вы можете выбрать имя по умолчанию.
  10. Выберите свою страну, по умолчанию в качестве валюты выбран доллар США, нажмите кнопку «Подтвердить».
  11. В следующем окне введите свои данные, как личные данные, так и данные банковского счета.
  12. Нажмите кнопку «Отправить и включить биллинг». Теперь мы создали проект Google Cloud с включенным биллингом.

Теперь все готово!

Установка Google Cloud Tools (Cloud SDK)

Инструменты Google Cloud - это набор утилит, которые очень полезны для настройки и доступа к продуктам Google Cloud: Google Kubernetes, Google App Engine, Google Big Query с вашего терминала. Чтобы начать установку Cloud SDK, перейдите в Google Cloud SDK и загрузите установщик SDK для своей ОС.

Google Cloud SDK содержит такие инструменты, как gcloud и gsutil , но мы будем использовать gcloud для инициализации и развертывания нашего приложения.

Инструмент gcloud содержит различные команды, позволяющие пользователям выполнять различные действия в проекте Google Cloud:

  • Информация о gcloud : отображает информацию о вашем Cloud SDK, вашей системе, вошедшем в систему пользователе и текущем активном проекте.
  • gcloud auth list : отображает список учетных записей Google, активных в Cloud SDK.
  • gcloud init : инициализирует облачный проект Google.
  • Справка gcloud : отображает команды, доступные в gcloud и их использование.
  • Список конфигураций gcloud Отображает список конфигураций gcloud

Хорошо, мы немного отвлеклись, давайте вернемся к тому, что у нас есть, после загрузки установщика Cloud SDK, запустите установщик и следуйте инструкциям, убедитесь, что вы отметили соответствующие представленные параметры. После завершения установки установщик запустит команду gcloud init в окне терминала.

Эта команда проведет вас через серию настроек. Он предоставит вам возможность войти в систему:

 You must log in to continue. Would you like to log in (Y/n)? 

Введите «Y» и нажмите клавишу Enter. Он запустит ваш веб-браузер по умолчанию, в котором вы выберете предпочитаемую учетную запись Google. После этого он отобразится в списке терминалов ваших проектов Google:

 You are logged in as [YOUR_GOOGLE_ACCOUNT_EMAIL]: 
 
 pick cloud project to use: 
 [1] [YOUR_PROJECT_NAME] 
 [2] Create a new project 
 Please enter numeric choice or text value (must exactly match list item): 

NB : gcloud автоматически выберет, если у вас только один проект.

Затем вам будет предложено выбрать зону Compute Engine по умолчанию:

 Which Google Compute Engine zone would you like to use project default: 
 [1] asia-east1-a 
 ... 
 [16] us-east1-b 
 ... 
 [25] Do not select default zone 
 Please enter numeric choice or text value (must exactly match list item): 

После выбора зоны по умолчанию gcloud выполняет серию проверок и распечатывает:

 Your project default Compute Engine zone has been set to [YOUR_CHOICE_HERE] 
 You can change it by running [gcloud config set compute/zone NAME] 
 
 Your project default Compute Engine region has been set to [YOUR_CHOICE_HERE] 
 You can change it by running [gcloud config set compute/region NAME] 

Ваш Google Cloud SDK настроен и готов к использованию!

Настройте наше приложение Node.js

Теперь наш проект Google Cloud настроен. Давайте настроим наше приложение Node.js. Мы собираемся создать RESTful API для фильма Черная пантера . Ух !!! Это будет здорово. 16 февраля 2018 года в кинотеатрах по всему миру состоялась премьера первого черного фильма о супергероях Marvel, который на момент написания этой статьи собрал огромные кассовые сборы в 903 миллиона долларов, что сделало его 45-м самым кассовым фильмом всех времен и самым кассовым фильмом. в 2018 году.

Давайте создадим API, который будет возвращать персонажей Черной пантеры .

Конечная точка API

  1. Персонаж - Этот ресурс посвящен персонажам Черной Пантеры.

    • POST - / blackpanther / Создает новый экземпляр Black Panther.
    • GET - / blackpanthers / Возвращает всех персонажей Черной пантеры.
    • GET - / blackpanther / <id> Возвращает указанный идентификатор символа Черной Пантеры.
    • PUT - / blackpanther / <id> Обновить атрибуты персонажа Черной Пантеры.
    • УДАЛИТЬ - / blackpanther / <id> Удалить персонажа Черной Пантеры.

Структура модели персонажа Черная пантера

 { 
 "alias": String, 
 "occupation": String, 
 "gender": String, 
 "place_of_birth": String, 
 "abilities": String, 
 "played_by": String, 
 "image_path": String 
 } 

Создание конечных точек API для API Черной Пантеры

Для начала давайте начнем с создания нашей папки проекта, откройте терминал и выполните следующую команду:

 $ mkdir _nodejs_gae 

Далее переходим в папку:

 $ cd _nodejs_gae 

Приложение Node.js инициализируется с помощью команды npm init . Теперь, когда мы находимся в папке нашего проекта, выполните следующую команду, чтобы создать экземпляр приложения Node.js:

 $ npm init -y 

Эти команды создают приложение Node.js с использованием ваших предварительно настроенных учетных данных. Теперь ваша папка будет выглядеть так:

 |- _nodejs_gae 
 |- package.json 

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

Создадим наш index.js (точка входа на наш сервер) - touch index.js

Создайте следующие папки:

  • mkdir routes
  • mkdir ctrls
  • mkdir models

Теперь у нас есть папки routes , ctrls и models

  • routes : будет содержать все маршруты, определенные в нашем API, и будет вызывать функцию контроллера, назначенную соответствующему HTTP-запросу.
  • ctrls : будет удерживать действие для получения запрошенных данных из моделей.
  • models : будет содержать модель базы данных нашего API.

У нас будет один маршрут, одна модель и один контроллер, связанный с нашим API. Выполните следующие команды, чтобы создать файлы:

  • touch routes/route.js
  • touch ctrls/ctrl.js
  • touch models/Character.js

Наша структура папок теперь должна выглядеть так:

 |- _nodejs_gae 
 |- routes/ 
 |- route.js 
 |- ctrls/ 
 |- ctrl.js 
 |- models/ 
 |- Character.js 
 |- index.js 
 |- package.json 

Хорошо, давайте установим наши зависимости:

  • npm i express -S
  • npm i mongoose -S
  • npm i body-parser -S

Теперь мы открываем наш Character.js и вставляем в него следующий код:

 const mongoose = require('mongoose') 
 
 let Character = new mongoose.Schema({ 
 alias: String, 
 occupation: String, 
 gender: String, 
 place_of_birth: String, 
 abilities: String, 
 played_by: String, 
 image_path: String 
 }) 
 module.exports = mongoose.model('Character', Character) 

Здесь мы объявили нашу модель схемы Character с помощью класса схемы mongoose Наша модель была экспортирована, поэтому мы можем импортировать и использовать схему в любом месте нашего приложения.

Хорошо, давайте добавим код в наш файл ctrl.js

 const Character = require('./../models/Character') 
 
 module.exports = { 
 getCharacter: (req, res, next) => { 
 Character.findById(req.params.id, (err, Character) => { 
 if (err) 
 res.send(err) 
 else if (!Character) 
 res.send(404) 
 else 
 res.send(Character) 
 next() 
 }) 
 }, 
 getAllCharacters: (req, res, next) => { 
 Character.find((err, data) => { 
 if (err) { 
 res.send(err) 
 } else { 
 res.send(data) 
 } 
 next() 
 }) 
 }, 
 deleteCharacter: (req, res, next) => { 
 Character.findByIdAndRemove(req.params.id, (err) => { 
 if (err) 
 res.send(err) 
 else 
 res.sendStatus(204) 
 next() 
 }) 
 }, 
 addCharacter: (req, res, next) => { 
 (new Character(req.body)).save((err, newCharacter) => { 
 if (err) 
 res.send(err) 
 else if (!newCharacter) 
 res.send(400) 
 else 
 res.send(newCharacter) 
 next() 
 }) 
 }, 
 updateCharacter: (req, res, next) => { 
 Character.findByIdAndUpdate(req.params.id, req.body, (err, updatedCharacter) => { 
 if (err) 
 res.send(err) 
 else if (!updatedCharacter) 
 res.send(400) 
 else 
 res.send(req.body) 
 next() 
 }) 
 } 
 } 

Здесь объявлены наши 4 CRUD y: getCharacter , deleteCharacter , getAllCharaccters и updateCharacter . Как видно из их названия, они выполняют действия CREATE , READ , UPDATE и DELETE в нашем API Black Panther.

Хорошо, давайте route.js файл route.js и вставим в него следующий код:

 const ctrl = require('./../ctrls/ctrl') 
 
 module.exports = (router) => { 
 
 /** get all Black Panther characters */ 
 router 
 .route('/blackpanthers') 
 .get(ctrl.getAllCharacters) 
 
 /** save a Black Panther character */ 
 router 
 .route('/blackpanther') 
 .post(ctrl.addCharacter) 
 
 /** get a Black Panther character */ 
 router 
 .route('/blackpanther/:id') 
 .get(ctrl.getCharacter) 
 
 /** delete a Black Panther character */ 
 router 
 .route('/blackpanther/:id') 
 .delete(ctrl.deleteCharacter) 
 
 /** update a Black Panther character */ 
 router 
 .route('/blackpanther/:id') 
 .put(ctrl.updateCharacter) 
 } 

Выше мы определили два основных маршрута ( /blackpanther и /blackpanther/:id ) с разными методами.

Как мы видим, нам нужен контроллер, чтобы каждый из методов маршрутов мог вызывать соответствующую функцию-обработчик.

Наконец, мы открываем наш файл index.js. Здесь мы связываем компоненты в одно целое. Мы импортируем функцию маршрутов, представленную нам в routes/route.js , и передаем express.Router() в качестве аргумента нашей функции routes Затем мы подключаемся к MongoDB а затем вызываем метод app.listen() для запуска сервера.

 const express = require('express') 
 const mongoose = require('mongoose') 
 const bodyParser = require('body-parser') 
 
 const app = express() 
 const router = express.Router() 
 const routes = require('./routes/route') 
 
 const url = process.env.MONGODB_URI || "mongodb://localhost:27017/blackpanther" 
 
 mongoose.connect(url, { 
 //useMongoClient: true 
 }) 
 
 routes(router) 
 app.use(bodyParser.json()) 
 app.use('/api/v1', router) 
 
 const port = process.env.PORT || 1000 
 
 app.listen(port, () => { 
 console.log(`Black Panther API v1: ${port}`) 
 }) 

Добавьте mLab Datastore к нашим конечным точкам API

Все это время мы использовали локальный экземпляр хранилища данных MongoDB. Мы будем развертывать и получать доступ к нашему приложению в инфраструктуре облачных вычислений, поэтому локального хранилища данных не будет. Чтобы сохранить наши данные, мы собираемся выбрать платформу «Данные как услуга» (DaaS), mLab.

  • Перейти в mLab
  • Создайте учетную запись, если у вас ее еще нет
  • Зайдите в личный кабинет, создайте новую базу данных
  • Скопируйте URL-адрес подключения к базе данных

Теперь, когда у нас есть строка URL-адреса подключения mLab, мы изменим файл index.js:

 ... 
 const url = process.env.MONGODB_URI || "mongodb://<DB_USER>:<DB_PASSWORD>@<MLAB_URL>.mlab.com:<MLAB_PORT>/<DB_NAME>" 
 ... 

Протестируйте наше приложение локально через cURL

Чтобы протестировать наше приложение на нашей локальной машине. Выполните следующую команду, чтобы запустить сервер:

 $ node . 

На вашем терминале будет отображаться что-то вроде этого:

 $ node . 
 Black Panther API v1: 1000 

Хорошо, теперь наш API Черной Пантеры запущен и работает, мы можем использовать cURL для тестирования API. Здесь мы отправим POST в API, чтобы создать нового персонажа Черной Пантеры:

 curl --request POST \ 
 --url http://localhost:1000/api/v1/blackpanther \ 
 --header 'content-type: application/json' \ 
 --data '{"alias":"tchalla","occupation":"King of Wakanda","gender":"male","place_of_birth":"Wakanda","abilities":"enhanced strength","played_by":"Chadwick Boseman"}' 

В качестве задачи для читателя вы должны продолжить и написать команды cURL для других конечных точек API.

Разверните наше приложение

Теперь наше nodejs готово к развертыванию, но прежде чем мы это сделаем, нам нужно настроить и добавить некоторые конфигурации. Сначала мы собираемся создать app.yaml для нашего проекта.

app.yaml - это конфигурация среды выполнения для среды App Engine. app.yaml позволяет нам настроить среду App Engine (Node.js, GO, PHP, Ruby, Python, .NET или Java Runtime) перед развертыванием.

С app.yaml мы можем делать следующее:

  • Распределить сетевые и дисковые ресурсы
  • Выберите гибкую среду
  • Выберите количество ядер ЦП, которое нужно выделить
  • Укажите размер memory_gb (RAM)

Список длинный, вы можете перейти на ресурс « Настройка приложения с помощью app.yaml», чтобы увидеть полные настройки конфигурации, разработанные Google.

Хорошо, давайте создадим в нашем проекте файл app.yaml

 touch app.yaml 

Откройте app.yaml и добавьте следующее содержимое:

 runtime: nodejs 
 env: flex 
 
 manual_scaling: 
 instances: 1 
 resources: 
 cpu: 1 
 memory_gb: 0.5 
 disk_size_gb: 10 

Глядя на приведенную выше конфигурацию, мы сообщаем App Engine, что наше приложение будет работать в среде выполнения Node.js, а также среда должна быть гибкой.

Использование гибкой среды требует затрат, поэтому мы сократили затраты, добавив:

 ... 
 manual_scaling: 
 instances: 1 
 resources: 
 cpu: 1 
 memory_gb: 0.5 
 disk_size_gb: 10 

Здесь мы указываем только один экземпляр, одно ядро ЦП, 0,5 ГБ ОЗУ и размер диска 10 ГБ.

Это идеально для целей тестирования и не для производственного использования.

Затем мы должны добавить start в разделе scripts нашего package.json , который используется средой выполнения Node.js для запуска нашего приложения при развертывании.

Без start средство проверки времени выполнения Node.js выдаст ошибку «Ошибка обнаружения приложения: ошибка: средство проверки nodejs: ни запуск в разделе сценариев в package.json, ни server.js не найден».

Давайте откроем package.json и добавим start в ключ scripts

 ... 
 "scripts": { 
 "start": "node .", 
 "test": "echo \"Error: no test specified\" && exit 1" 
 }, 
 ... 

После этого мы готовы к развертыванию. Чтобы развернуть наше приложение, выполните эту команду:

 $ gcloud app deploy 

Тестирование нашего развернутого приложения с помощью cURL

Чтобы протестировать наш API-интерфейс развернутого приложения Node.js, нам нужно будет использовать целевой URL-адрес, предоставленный нам Google App Engine.

 curl --request POST \ 
 --url http://YOUR_TARGET_URL.appspot.com/api/v1/blackpanther \ 
 --header 'content-type: application/json' \ 
 --data '{"alias":"tchalla","occupation":"King of Wakanda","gender":"male","place_of_birth":"Wakanda","abilities":"enhanced strength","played_by":"Chadwick Boseman"}' 

С помощью cURL мы отправили запрос POST и полезную нагрузку персонажа Black Panther в наше развернутое приложение Node.js, используя целевой URL в качестве параметра url.

Наша конечная точка API выполняет функцию POST, сохраняет полезные данные в нашей базе данных mLab и отправляет нам результат:

 { 
 "alias":"tchalla", 
 "occupation":"King of Wakanda", 
 "gender":"male", 
 "place_of_birth":"Wakanda", 
 "abilities":"enhanced strength", 
 "played_by":"Chadwick Boseman","_id":"5aa3a3905cd0a90010c3e1d9", 
 "__v":0 
 } 

Поздравляю! Мы успешно развернули наше первое приложение Node.js в Google App Engine.

Заключение

В этой статье мы увидели, насколько простой и беспроблемный Google App Engine делает нашу жизнь. Кроме того, с помощью всего нескольких команд можно настроить мощный движок времени выполнения и развернуть на нем ваше приложение. Не нужно думать о масштабировании, ресурсах, пропускной способности и остальном.

App Engine думает за вас.

Чтобы отметить, что предлагает нам Google App Engine:

  1. Хороший отчет об ошибках
  2. Упрощает безопасность API
  3. Надежность и поддержка
  4. Квоты использования для бесплатных приложений

Не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы или комментарии, в разделе комментариев.

comments powered by Disqus