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

В этом посте будет показано, как интегрировать обнаружение сервисов и интеллектуальную маршрутизацию в приложение Node.js, построенное с использованием архитектуры микросервисов. Вы увидите, как это можно сделать с помощью двух проектов Netflix с открытым исходным кодом, Eureka и Zuul, которые выполняются в среде выполнения Java SE.

Сервер Netflix Eureka обеспечивает обнаружение сервисов. Это дает службам вашего приложения возможность находить другие службы, не зная, где они размещены или полный URL-адрес, необходимый для доступа к ним, поэтому вам не нужно указывать полные URL-адреса для каждой службы, которая должна подключиться к другой службе.

Сервис Netflix Zuul обеспечивает динамическую маршрутизацию. Использование Zuul в вашем приложении позволяет вашим службам использовать информацию из каталога служб Eureka для доступа к другим службам.

Поскольку и Eureka, и Zuul являются приложениями Java, они могут быть реализованы с помощью Spring Boot, части Spring Framework для Java. С помощью Spring Boot вы можете упаковать Java-приложения в файл Java Archive (.jar), который можно запускать в Java SE Runtime Environment. Это позволяет легко развернуть сервер Node.js в контейнере вместе с Eureka и Zuul.

Spring построил конфигурации для распространенных сценариев использования в Spring Cloud Netflix, включая обнаружение сервисов с Eureka и интеллектуальную маршрутизацию с Zuul. Файлы .jar создаются с помощью Apache Maven с использованием файлов объектной модели проекта (pom.xml) для Eureka и Zuul, доступных как часть репозитория Spring Guides на GitHub.

Предпосылки

Для выполнения задач программирования, описанных в этом посте, вам понадобится следующее:

Для наиболее эффективного изучения этого поста у вас должно быть следующее:

  • Практическое знание JavaScript и Node.js
  • Некоторое знакомство с протоколом HTTP

На GitHub есть вспомогательный репозиторий для этого поста.

Создайте базовую распределенную систему JavaScript

Если вы завершили проект из первого поста этой серии Создание микросервисов JavaScript с помощью Node.js, вы можете продолжить работу с кодом, который вы написали для этого поста: проект Node.js для этого поста построен на этой кодовой базе. . Если вы знакомы с созданием микросервисов JavaScript или хотите начать с нуля, вы можете получить код с GitHub.

Клонируйте проект, выполнив следующие инструкции командной строки в каталоге, в котором вы хотите создать корневой каталог проекта:

git clone https://github.com/maciejtreder/introduction-to-microservices.git
cd introduction-to-microservices/heroes
git checkout step2
npm install
cd ../threats
npm install

Зарегистрируйте услуги в Eureka

Существующее приложение представляет собой простую систему с двумя службами и жестко заданными URL-адресами. Что делать, если вы хотите добавить больше экземпляров heroes-service? Как могла служба угроз определить, какую из них использовать? Следует ли жестко закодировать два URL-адреса?

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

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

Архитектура, которую вы собираетесь реализовать, проиллюстрирована на следующей диаграмме:

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

Второй тип потока, представленный синими линиями, возникает, когда система получает запрос:

  1. Подается просьба отнести героя к угрозе!
  2. Zuul, основываясь на информации, полученной от Eureka, предоставляет этот запрос желаемому сервису, угрозам-сервису,
  3. Служба угроз отправляет Зуулу запрос «сообщить службе героя установить статус назначенного героя на« занято »».
  4. Зуул пересылает этот запрос службе героев.

Загрузите следующие архивные файлы Java и поместите их в корневой каталог проекта:

Eureka-service-0.0.1-SNAPSHOT.jar (42,6 МБ)

Zuul-0.0.1-SNAPSHOT.jar (39,6 МБ)

Взгляните на пользовательский интерфейс Eureka, выполнив следующую инструкцию командной строки в корневом каталоге вашего приложения. Пользователи Windows должны выполнять инструкции в окне командной строки Windows (cmd.exe), а не в окне PowerShell.

java -jar eureka-service-0.0.1-SNAPSHOT.jar

Перейдите к приложению Eureka по адресу http: // localhost: 8761 в своем любимом браузере.

По умолчанию служба Eureka работает на порту 8761. Это можно изменить с помощью параметра --server.port; но не делайте этого, если у вас нет веской причины, например, конфликта портов.

Зарегистрируйте экземпляр службы в Eureka с помощью RESTful API

Хотя службы могут быть настроены с помощью Eureka с использованием Spring Framework, Eureka также имеет RESTful API, который можно использовать с приложениями, отличными от Java. Чтобы зарегистрировать новую службу, вы можете выполнить POST-запрос к конечной точке http: // localhost: 8761 / eureka / apps / my-service. Это можно сделать с помощью команды curl, как показано ниже.

В корневом каталоге приложения создайте файл eureka-curl-payload.json и вставьте следующие данные JSON:

Значение для app, показанное как «моя-служба», является дескриптором, используемым для имени службы. Все включенные элементы данных необходимы для регистрации услуги в Eureka.

Выполните следующую инструкцию командной строки curl в корневом каталоге приложения:

curl -i --request POST --header "Content-Type: application/json" --data @eureka-curl-payload.json http://localhost:8761/eureka/apps/my-service

После выполнения этого запроса вы должны увидеть в выводе терминала следующее:

HTTP/1.1 204 
Content-Type: application/xml
Date: Mon, 22 Apr 2019 13:37:43 GMT

Кроме того, my-service должен быть указан в таблице Экземпляры, которые в настоящее время зарегистрированы в Eureka по адресу http: // localhost: 8761, как показано ниже:

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

Оставьте окно консоли открытым и оставьте Эврику работать. Вам снова понадобятся и то, и другое.

Вот объяснение информации, необходимой Eureka для правильной регистрации экземпляра службы:

hostname - имя хоста сервиса

app - имя сервиса (должно быть равным имени из URI)

vipAdress - виртуальное имя хоста

instanceId - уникальный id экземпляра сервиса

ipAddr - IP-адрес компьютера, на котором запущен экземпляр (используйте 0.0.0.0, чтобы использовать hostname вместо IP-адреса.)

status - статус услуги (UP, DOWN, STARTING, OUT_OF_SERVICE, UNKNOWN)

port - объект JSON, содержащий информацию о порте, на котором запущен экземпляр службы

dataCenterInfo - свойство, необходимое при запуске Eureka в среде Amazon Web Services. При работе на AWS для него должно быть установлено значение «облако».

Зарегистрируйте приложение Node.js в Eureka

Теперь вы готовы внедрить механизм регистрации в проект тематического исследования. Поскольку вы собираетесь использовать один и тот же механизм как в сервисах heroes-service, так и в сервисах угроз-service, вы можете создать отдельный проект npm, который будет использоваться обеими службами для регистрации в Eureka.

Создайте каталог / eureka-helper на том же уровне, что и каталоги / heroes и / угрозы.

Перейдите в каталог / eureka-helper и создайте файл eureka-helper.js.

В каталоге / eureka-helper инициализируйте проект npm и установите необходимые зависимости, выполнив следующие инструкции командной строки:

npm init -y
npm install request 
npm install ip

Вставьте следующий код JavaScript в файл /eureka-helper/eureka-helper.js:

Проект eureka- h elper предоставляет метод registerWithEureka, который выполняет HTTP-запрос POST, который вы пробовали при тестировании Eureka. Когда метод получает положительный ответ, он начинает посылать контрольный сигнал Eureka, чтобы предотвратить отмену регистрации службы, как указано выше. Это делается в методе setInterval:

Теперь вы можете вызвать метод registerWithEureka из каждой службы.

Измените файл /threats/threats.js так, чтобы последние три строки кода выглядели следующим образом:

Измените файл /heroes/heroes.js так, чтобы последние три строки читались следующим образом. Обратите внимание, что один из аргументов для registerWithEureka отличается:

Откройте окно консоли в каталоге / heroes и выполните следующую инструкцию командной строки, чтобы запустить службу. Пользователи Windows должны использовать командное окно (cmd.exe), а не PowerShell:

node heroes.js 3838

Результат должен выглядеть следующим образом:

Registering heroes-service with Eureka
Heroes service listening on port 3838
Registered with Eureka.

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

Откройте другое окно консоли в каталоге / угрозы и запустите службу с помощью следующей инструкции командной строки:

node threats.js 3939

Результат должен выглядеть следующим образом:

Threats service listening on port 3939
Registering threats-service with Eureka
Registered with Eureka.

В своем браузере откройте вкладку Eureka (http: // localhost: 8761) и убедитесь, что обе службы перечислены в разделе Экземпляры, в настоящее время зарегистрированные в Eureka, как показано ниже:

Если вы не выполняли кодирование и хотите наверстать упущенное на этом этапе, используя код из репозитория GitHub, выполните следующие команды в каталоге, в котором вы хотите создать каталог проекта:

git clone https://github.com/maciejtreder/introduction-to-microservices.git
cd introduction-to-microservices/heroes
git checkout step3
npm install
cd ../threats
npm install
cd ../eureka-helper
npm install
cd ..

Найдите услуги с Zuul

Теперь, когда сервисы зарегистрированы в Eureka, их можно найти с помощью возможностей динамической маршрутизации Zuul.

Откройте новое окно консоли (это будет четвертое командное окно, которое вы откроете) в корневом каталоге приложения.

Запустите службу Zuul, выполнив следующую инструкцию командной строки в новом окне консоли. Это будет пятое открытое окно консоли:

java -jar zuul-0.0.1-SNAPSHOT.jar

Эта команда запустит Zuul на HTTP-порту 8080. По умолчанию Zuul будет искать службу Eureka по адресу http: // localhost: 8761. Если вы изменили порт для Eureka, вы можете переопределить настройки Zuul по умолчанию, используя встроенные аргументы, как показано ниже, где первый номер порта - это Zuul, а второй - Eureka:

java -jar zuul-0.0.1-SNAPSHOT.jar --server.port=9090 --eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

Откройте новую вкладку браузера и перейдите к http: // localhost: 8080 / routes (или к порту, которому вы назначили Zuul, если вы его изменили). Вы должны увидеть список маршрутов, зарегистрированных в Зууле, следующим образом:

{"/hero-service/**":"heroes-service","/threats-service/**":"threats-service"}

Оставьте службу Zuul работающей.

Используйте Зуул, чтобы найти героев-сервис

Zuul работает, но необходимо изменить службу угроз, чтобы использовать Zuul для поиска службы героев; В настоящее время служба угроз использует жестко запрограммированный URL-адрес, который плохо масштабируется. Изменить сервис для использования Zuul очень просто.

В окне консоли, в котором вы запускаете службу угроз, остановите ее и оставьте окно открытым.

Найдите следующую строку в файле угроз / угрозs.js:

Измените его так, чтобы он указывал на порт, на котором работает Zuul, за которым следует имя heroes-service, как оно было зарегистрировано в eureka-helper / eureka-helper.js:

Сохраните файл и перезапустите службу угроз.

Убедитесь, что Эврика и Зуул работают

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

Вы можете использовать Почтальон, curl, PowerShell Invoke-WebRequest или ваш браузер. Если вы хотите использовать curl, откройте окно консоли и выполните следующую инструкцию командной строки:

curl -i --request POST --header "Content-Type: application/json" --data "{\"heroId\": 1, \"threatId\": 1}" localhost:8080/threats-service/assignment

Обратите внимание, что вам нужно будет изменить номер порта, если вы изменили номер порта, на котором работает Zuul.

Если служба работает правильно, вы должны увидеть результаты, похожие на следующий вывод консоли из curl:

HTTP/1.1 202 
X-Application-Context: application:8080
X-Powered-By: Express
ETag: W/"79-ER1WRPW1305+Eomgfjq/A/Cgkp8"
Date: Fri, 05 Apr 2019 18:05:54 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
{"id":1,"displayName":"Pisa tower is about to collapse.","necessaryPowers":["flying"],"img":"tower.jpg","assignedHero":1}

В окне консоли для heroes-service вы должны увидеть вывод, похожий на:

Heroes service listening on port 3838
Registered with Eureka.
Successfully sent heartbeat to Eureka.
Successfully sent heartbeat to Eureka.
Set busy to true in hero: 1

Поздравляю! Теперь у вас есть более масштабируемое и надежное приложение для микросервисов!

Если вы хотите наверстать упущенное на этом этапе, используя код из репозитория GitHub, выполните следующие команды в каталоге, в котором вы хотите создать каталог проекта:

git clone https://github.com/maciejtreder/introduction-to-microservices.git
cd introduction-to-microservices/heroes
git checkout step4
npm install
cd ../threats
npm install
cd ../eureka-helper
npm install
cd ..

Резюме

В этом посте вы узнали, как использовать обнаружение сервисов в Eureka. Вы увидели, как делегировать ответственность за выполнение различных задач отдельным приложениям и взаимодействовать между службами. Оба приложения взаимодействуют друг с другом с помощью открытых API-интерфейсов REST. Каждый из них управляет только данными, за которые он отвечает, и может поддерживаться, расширяться и развертываться без привлечения другой службы. Оба приложения доступны в одном домене localhost: 8080. Чтобы получить к ним доступ, вам нужно только добавить их назначенные дескрипторы к URL-адресу.

Следующий шаг Масштабирование микросервисов JavaScript Node.js на общих слоях сохраняемости облака MongoDB Atlas.

Дополнительные ресурсы

Архитектурные стили и проектирование сетевых архитектур программного обеспечения, Рой Томас Филдинг, 2000 г. - в докторской диссертации Филдинга описывается передача репрезентативного состояния (глава 5) и другие архитектурные стили.

Микросервисы. Несмотря на недостатки, статья в Википедии является хорошей отправной точкой для поиска дополнительной информации об архитектуре и реализации микросервисов.

Справочная документация по Node.js

Проект Spring Cloud NetflixSpring Cloud Netflix … обеспечивает интеграцию Netflix OSS для приложений Spring Boot посредством автоконфигурации и привязки к среде Spring и другим идиомам модели программирования Spring.

Я Мачей Тредер, свяжитесь со мной через [email protected], https://www.maciejtreder.com или @maciejtreder на GitHub, Twitter и LinkedIn.

Этот пост изначально опубликован в блоге Twilio.