Предисловие

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

Когда я говорю о переходе, я имею в виду не только реализацию приложения, но и образ мышления и представление об архитектуре микросервисов. Ну а что культ, а что нет — это уже другая часть истории. В этой статье мы увидим, как этот фреймворк (Moleculer) не только поможет нам создавать микросервисы, но также изменит и направит наше мышление о правильном шаблоне микросервисов или архитектуре.

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

Когда мы говорим, что микросервис имеет первое преимущество, мы смотрим на модульность. Представьте себе очень простое приложение, имеющее CRM, file_processing, маршрутизацию как часть серверной службы и любое из angular/react/vue как часть службы font-end. Таким образом, глубинная серверная служба имеет в общей сложности 3 или более микросервисов, а внешний интерфейс имеет 1 только для обслуживания страниц.

В любой момент времени, если ваше приложение требует слишком много запросов на обработку файлов, то, чтобы воспользоваться преимуществами микросервисной архитектуры, я просто масштабирую службу file_processing до большего количества реплик, чтобы улучшить возможности. Теперь вопрос, как только масштабировать конкретный сервис?.
Можно подумать, что отдельный микросервис должен иметь собственный репозиторий и конвейеры CI/CD. Но с молекулярным это не так. У нас может быть один репозиторий для одного и того же.
Да, вы не ослышались!
Molecular обладает такой функциональностью. Каждый отдельный модуль может быть написан в сервисе. Moleculer запускает эти службы как отдельные узлы, это означает, что у нас может быть многопоточность, поскольку она поддерживает встроенную кластеризацию. Так что в дальнейшем его можно развернуть как индивидуальное.
Чтобы уточнить это, у нас может быть Docker для развертывания этих сервисов, тогда docker будет иметь один сервис для каждого контейнера (Service-Per-Container). Теперь вы можете себе представить, как Docker может вывести это на новый уровень с точки зрения масштабируемости и так далее.

Что ж, когда мы говорим об отдельных сервисах, первый вопрос приходит на ум, а как насчет связи между ними.
Компания Molecular предлагает встроенные транспортеры для беспрепятственной связи. Вам не нужно беспокоиться об этом, даже если ваши сервисы будут лежать на разных экземплярах. Встроенные транспортеры, такие как NATS, TCP, Kafka, AMQP, MQTT, Redis могут творить для вас чудеса (Транспортеры). Если вы все еще не убеждены, выберите Custom Transporters, которые поддерживает moleculer.

Приложения, в которых вам необходимо иметь аутентификацию/авторизацию, проверки, полноценные регистраторы для сбора локальных и глобальных контекстных данных. Молекулятор предоставляет контекстную информацию в каждой службе (Контекст). Также позволяет нам повторно использовать сервисы через примеси (Сервисы). Molecular Services предлагает множество функций, таких как события жизненного цикла, группировка событий, внедрение зависимостей, горячая перезагрузка сервисов.

Работая в ИТ-индустрии, как технарь/разработчик, мы иногда должны чувствовать себя увязшими в запросах клиентов/заинтересованных лиц. И это слишком утомительно, когда вы работаете над конкретным бункером.
Точно так же в микросервисах, если какой-либо сервис отправляет запрос другому сервису, система тоже перегружается. В такой ситуации у нас должны быть автоматические выключатели в нашей инфраструктуре приложений. Если вы прочитали эту ссылку, то наверняка будете поражены реализацией. Что ж, у молекулярного есть встроенный прерыватель цепи (CircuitBreaker).

После этого блога вы можете прочитать где-нибудь в документации о ServiceBroker. Простите за опоздание, это очень важный компонент Molecular (ServiceBroker). Его работа заключается в настройке и обработке всех сервисов, событий и связи между узлами.
Представьте себе, что это Брокер для обслуживания. Всякий раз, когда вы хотите заключить сделку с обслуживанием, внутренне Брокер приходит первым, с чем вам приходится сталкиваться. Вы можете создать экземпляр ServiceBroker для каждой службы или оставить один ServiceBroker для обработки всех служб на одном узле.

Несчастный случай

Что ж… достаточно взглянуть на молекуляр. Позвольте мне поделиться с вами чем-то реальным.

Как разработчик, я работал над приложением, в котором есть много сервисов.
У каждого сервиса есть работа по анализу банковских выписок на основе регулярных выражений и дампу в базу данных. И подход заключался в индивидуальном обслуживании каждого банковского счета. Таким образом, мы разработали от 30 до 40 микросервисов в moleculer с одним базовым узлом, поддерживающим все сервисы.

Однажды мы развернули последнюю сборку в промежуточной среде, и все прошло хорошо. На следующее утро все пьют пиво, а затем владелец продукта сообщил мне, что у него проблемы в банке XYZ. Он сказал мне сначала выпить кофе, а потом разобраться, вроде ничего срочного. Днем я начинаю выяснять, что пошло не так. Я проверил модульные тесты... все хорошо, проверил интеграционные тесты... все хорошо, проверил CI/CD... все хорошо. Потратив несколько часов, я был потрясен, увидев, что 4 моих банковских сервиса не могут работать в тестовой среде. Когда все пошло хорошо, то что пошло не так..? чтобы понять это, мне понадобился целый день, хотя для команды это был гладкий день.

На следующий день то, что я обнаружил, совершенно невероятно. К сожалению, наша локальная инфраструктура, в которой настроена промежуточная среда, имеет версию NodeJS v8.x.x. И наше приложение совместимо с NodeJS v10.13.x. Недавно развернутые службы с последней реализацией регулярных выражений были несовместимы с NodeJS v8.x.x, поэтому все 30 банков работают без сбоев, кроме этих 4.
Я сказал… правда !!! ???
Я был поражен и потрясен этим.
Это был поворотный момент, когда я действительно восхитился молекулой.

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

Как только вы начнете ощущать аромат, образ вашего мышления переместится прямо к рассветной стене Капитана. Я лично понимаю, что с Molecular Framework и MicroServices так много общего.