Проверки работоспособности в Node.js

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

В этой статье я расскажу о следующих моментах:

  • Введение о концепции «Проверка работоспособности»
  • Реализация проверок работоспособности в вашем проекте NodeJS
  • Простой пример того, как вы можете использовать библиотеки сообщества и настроить их в соответствии с вашими потребностями.

Зачем нам нужны проверки здоровья

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

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

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

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

Хотите узнать больше о проверках работоспособности, можете прочитать следующую статью:



Что именно мы должны проверять внутри Health Checks

Некоторые люди возвращают успешный ответ HTTP 200 только из конечной точки проверки работоспособности, чтобы убедиться, что микросервис работает, но я думаю, что было бы безопаснее проверять ресурсы и зависимости, которые использует микросервис, как соединение к базе данных, к кэш-серверу, другим HTTP-службам… и т. д.

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

Некоторые фреймворки уже поддерживают такую ​​конечную точку, и вам просто нужно настроить ее, как в Spring Boot.

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

Таким образом, эти проверки проверяют, работает ли общее поведение системы, но не всегда то, что мы должны делать, это зависит от типа системы и бизнес-логики.

Быстро внедряйте проверки работоспособности в NodeJS

Я нашел очень интересную библиотеку, которая уже имеет большое количество встроенных проверок и поддерживает платформу NodeJS Express, вы можете найти ее здесь:



Вы можете проверить соединение MySql DB, соединение Mongo DB, соединение Redis, Elasticsearch, любую другую службу Http, и легко добавить пользовательские проверки, которые соответствуют вашим потребностям.

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



А установить его можно с помощью следующего пакета npm:



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

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

И вскоре я планирую добавить еще чеков к этому разветвленному.

Мне нравится использовать эту библиотеку через промежуточное ПО, которое будет инициализировано при запуске микросервиса:

Как вы можете видеть здесь, я проверяю соединение с базой данных MySQL и соединение с кешем Redis. Я беру параметры из переменных среды, пожалуйста, не забудьте дождаться функции healthCheck, иначе она не будет работать вообще, потому что, не дожидаясь, пока healthCheck завершит работу сервера с запусками, напрямую игнорируя маршруты проверок работоспособности определены внутри библиотеки.

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

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

Я использую контейнер IoC для инициализации промежуточного программного обеспечения и сервисов, если вам интересно, вы можете взглянуть на следующую библиотеку:



Обычно я определяю имена всех своих промежуточных программ в файле внутри папки промежуточного программного обеспечения, экспортируя объект, который содержит только пары «ключ-значение» промежуточного программного обеспечения (например, перечисление на языках ООП). Таким образом, IoC по названию промежуточного программного обеспечения будет понимать тип экземпляра, который он должен инициализировать.

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

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