2017-01-13 3 views
3

Я работаю над персональным проектом, который должен преобразовать монолитное веб-приложение в микросервисы (каждая служба имеет свою собственную базу данных).Межкоммуникационные микросервисы - Как?

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

Сначала я пытался использовать REST вызова со следующим примером: «Регистрация Сервис» вставляет интересные вещи в свою базу данных, а затем вперед (HTTP POST) информация о пользователе в «User Service» для того, чтобы сохраниться его в базу данных пользователя. В этом примере у нас есть 2 службы, таким образом, 2 базы данных.

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

Вторая идея заключалась в том, чтобы использовать сообщение message broker как RabbitMQ. «Служба регистрации» по-прежнему вставляет интересные вещи в свою собственную базу данных и публикует сообщение в очереди с информацией пользователя в виде данных. «Пользовательская служба» потребляет это сообщение и сохраняет данные в своей «пользовательской» базе данных. Используя эту концепцию, обе службы полностью изолированы и могут быть отличной идеей.

BUT, как об ответе направить клиенту (кто обратился к «Службе регистрации»). С первой идеей мы могли бы отправить «200, все в порядке!» или 400. Это не проблема. Со второй идеей мы не знаем, сохранял ли пользователь («Пользовательская служба») пользовательские данные, так что мне нужно ответить клиенту?

У меня такая же проблема со стороны магазина веб-приложения. Клиент отправляет продукт, который он хочет купить, на «Заказать услугу». Это нужно проверить виртуальные деньги, которые у него есть на «Сервис пользователя», а затем перенаправить деталь продукта в «Доставка услуги», если у пользователя достаточно денег. Как это сделать с полностью изолированными услугами?

Я не хочу использовать время запроса http от клиента, чтобы сделать асинхронный запрос/ответ на брокер сообщений.

Я надеюсь, что некоторые из вас просветят меня.

+0

Читайте это: http://stackoverflow.com/questions/30213456/transactions-across-rest-microservices –

ответ

0

Tom предложил pretty good link, где голосовой ответ с его аргументацией и решением - тот, на который вы можете положиться. Ваша конкретная проблема может быть связана с тем, что служба регистрации и пользовательская служба являются отдельными. Может быть, их не должно быть?

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

0

Спасибо за ссылку,

Мои проблемы превратить архитектуру у меня в новую. Для тех, кто имеет те же проблемы у меня есть, есть вещи, которые я сделал благодаря этой ссылке:

  • Доведите Регистрацию службу и службу пользователя вместе. Зачем ?Потому что все зависит от информации пользователя (те же требования к базе данных). Это решение IlliakaillI дало.

  • Отделите управление деньгами пользователя на «Кошелек», который существует только в «Сервис заказа». Благодаря этому нам не нужно получать информацию о пользователе при выполнении заказа, нам просто нужно проверить информацию о кошельке. (Я зашифровал имя пользователя в JWT, когда пользователь выполняет проверку подлинности. Таким образом, я могу использовать в моем бумажнике имя пользователя в качестве внешнего ключа, чтобы распознать, какой кошелек подается, или используется и т.д.)

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

Скажите, если я ошибаюсь, но это здорово для меня.

Смежные вопросы