Последние три года я занимался исключительно фронтенд-разработкой с Ember.js. Тем временем микросервисы стали повальным увлечением на серверах.

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

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

GAE позволяет разработчикам составлять сложные приложения из более мелких микросервисов. Каждый микросервис работает внутри своего контейнера Docker, изолированного от других микросервисов. Приложение, управляемое микросервисами, ведет себя как обычное веб-приложение. Между пользователем и микросервисами находится балансировщик нагрузки, который направляет запросы пользователя к службе для определенного URL-адреса.

Такая архитектура звучит потрясающе, очень сложно и слишком сложно для большинства людей реализовать самостоятельно. Все это GAE предоставляет вам по умолчанию; вам просто нужно знать, как его настроить.

Я собираюсь показать вам, как составить приложение из нескольких микросервисов Node.js. Прежде чем мы начнем, обязательно настройте свой компьютер, следуя инструкциям Перед тем, как начать, раздел« Быстрый запуск для Node.js на странице гибкой среды App Engine».

Часть 1. Разверните основное приложение в GAE

  1. Запустите gcloud init, чтобы войти в Google Cloud из командной строки.
  2. Создайте пустой каталог с mkdir ~/node-microservices-example
  3. Зайдите в каталог с cd ~/node-microservices-example
  4. Создайте проект Google App Engine с gcloud app create
  5. Инициализируйте проект Node.js с помощью npm init

Пока у вас есть каталог, в котором находится только package.json. Следующим шагом является изменение вашего package.json, чтобы иметь все конфигурации, необходимые GAE для правильной настройки приложения при его развертывании.

6. Создайте файл server.js. Он будет содержать код для сервера Node.js, который будет отвечать на все запросы этого приложения.

7. Отредактируйте файл package.json, чтобы сообщить GAE, как запустить сервер после его развертывания. Для этого добавьте свойство start в хэш scripts.

{
  ...
  "scripts": {
    "start": "node server.js"
  },
  ...
}

GAE использует команду node start для запуска сервера. Эта команда ищет сценарий start. node server.js выполнит server.js с node исполняемым файлом.

8. Скажем GAE использовать Node.js 6 для запуска нашего сервера, указав свойство engine в package.json.

{
  ...
  "engines": { 
    "node" : ">=6.0.0" 
  },
  ...
}

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

9. Создайте файл app.yaml со средой выполнения nodejs и средой flex.

runtime: nodejs
env: flex 

10. Теперь давайте создадим простой сервер express в server.js, который будет отвечать на запросы. Отредактируйте server.js и добавьте следующий код

"use strict"; 
const express = require('express'); 
const app = express(); 
app.get('/', (req, res) => {    
   res.status(200).send('Hello world!');
});
app.listen(process.env.PORT);

В последней строке сценария app.listen(process.env.PORT); мы разрешаем среде указать порт, который наш сервер должен прослушивать для входящих запросов. По умолчанию GAE направляет запросы на порт 8080, и этот порт будет автоматически предоставлен вашему серверу.

11. Перед развертыванием нашего приложения мы должны убедиться, что у нашего приложения есть зависимости, необходимые для его запуска. Мы использовали пакет express, поэтому нам нужно установить run npm install --save express, чтобы добавить пакет express к зависимостям в package.json.

В дополнение ко всему, что было сгенерировано npm init, ваш package.json должен содержать следующие записи.

{
  "name": "node-microservices-example",
  "scripts": {
    "start": "node server.js"
  },
  "engines": {
    "node": ">=6.0.0"
  },
  "dependencies": {
    "express": "4.14.0"
  }
}

12. Давайте развернем наше приложение с gcloud app deploy.

13. После развертывания вы можете увидеть результат, запустив gcloud app browse. Это откроет приложение в браузере.

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

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

Часть 2: добавление первого микросервиса

Мы создадим новую службу под названием admin и перенаправим весь трафик с /admin на эту службу. Каждый микросервис - это отдельное приложение со своими зависимостями и файлом app.yaml. Маршрутизация запросов к этому микросервису выполняется путем настройки dispatch.yaml в нашем основном приложении (то есть в службе по умолчанию).

  1. Начнем с создания каталога для нашей службы admin. Этот каталог может быть где угодно, но для удобства мы поместим его в наш node-microservices-example каталог. mkdir ~/node-microservices-example/admin
  2. Ваше приложение admin должно быть заполнено само по себе. У него должен быть файл package.json с собственным start скриптом, свойством engines и собственными зависимостями. Выполните шаги 5–8 части 1 для получения инструкций.
  3. Чтобы сообщить GAE, что вы создаете другую службу, необходимо указать имя службы в файле app.yaml микросервиса.
env: flex
runtime: nodejs
service: admin

app.yaml не нужно называть app.yaml. Вы можете называть его admin.yaml, пока установлено свойство service: admin, GAE будет знать, что вы развертываете микросервис, а не службу по умолчанию. Использование app.yaml позволяет запускать gcloud app deploy внутри каталога admin, и команда gcloud будет искать app.yaml автоматически.

4. Создайте server.js для раздела admin.

"use strict"; 
const express = require('express'); 
const app = express(); 
app.get('/', (req, res) => {    
   res.status(200).send('Admin Section');
});
app.listen(process.env.PORT);

5. Мы еще не закончили, но давайте развернем эту службу, чтобы посмотреть, что произойдет. Чтобы развернуть микросервис, вы можете запустить gcloud app deploy внутри каталога микросервиса или gcloud app deploy admin/app.yaml из каталога основного приложения.

6. Если вы запустите gcloud app browse -s admin, окно браузера откроется в субдомене URL-адреса вашей службы по умолчанию. Каждая служба автоматически получает субдомен, к которому можно получить доступ, перейдя по URL-адресу.

7. Мы хотим, чтобы наша служба admin была доступна с /admin url, а не с субдомена. Мы можем настроить маршрутизацию для нашего приложения по умолчанию, создав файл dispatch.yaml.

dispatch:
  - url: '*/admin'
    module: admin

8. Конфигурация отправки сообщает GAE, как маршрутизировать запросы внутри вашего приложения. Он не перезаписывает URL-адреса. Таким образом, наш сервер должен явно прослушивать запросы на /admin. Давайте изменим admin / server.js для обработки /admin url.

"use strict";
const express = require('express');
const app = express();
app.get('/admin', (req, res) => {    
   res.status(200).send('Admin Section');
});
app.listen(process.env.PORT);

9. Давайте развернем нашу обновленную службу admin и конфигурацию маршрутизации, запустив gcloud app deploy admin/app.yaml dispatch.yaml

Теперь у вас есть приложение, состоящее из двух приложений. основное приложение, обслуживаемое службой default, и приложение admin, обслуживаемое службой admin. GAE автоматически обрабатывает запросы маршрутизации от /admin url к службе admin, и эти службы работают изолированно друг от друга в своих собственных контейнерах.

Код этого приложения доступен на GitHub. Следуйте за мной, чтобы узнать больше о создании приложений с помощью Google App Engine.

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