Мы создаем новое промышленное веб-приложение, и один из вопросов, который ломает голову в последние несколько дней, касается интеграции между различными «микросервисами» в этой архитектуре.
Я использую микросервисы с небольшим количеством соли, потому что мы не полностью охватываем концепции для определения реальных микросервисов. Одно (и я думаю, самое большое) различие заключается в том, что мы используем одну и ту же общую базу данных в разных модулях (которые я называю «микросервисами»). Некий логический взгляд на нашу систему можно нарисовать так:
╔══════════════╗
║ Client ║ ══╗
╚══════════════╝ ║ (2)
║
▼
╔══════════════╗ (1) ╔══════════════╗
║ Serv. Reg. ║ <==> ║ API Gatew. ║
╚══════════════╝ ╚══════════════╝
█ █ █████████████ (4)
█ █ ████
╔══════════════╗ ╔══════════════╗ ╔══════════════╗
║ Module A ║ ║ Module B ║ ║ Module C ║ <===== "Microservices"
╚══════════════╝ ╚══════════════╝ ╚══════════════╝
║║ (3) ║║ (3) ║║ (3)
║║ ║║ ║║
╔══════════════════════════════════════════════════╗
║ Database Server ║
╚══════════════════════════════════════════════════╝
Некоторые вещи, которые мы уже выяснили:
- Клиенты (внешние системы, внешние приложения) будут получать доступ к различным внутренним модулям, используя шаблон обнаружения / маршрутизации. Мы рассматриваем сочетание Netflix OSS Eureka и Zuul, чтобы обеспечить это. Службы (модули A, B, C) сами регистрируются (4) в модуле регистрации служб и координируют действия шлюза API (1) с регистром, чтобы найти экземпляры служб для полного выполнения запросов (2).
- Все разные модули используют одну и ту же базу данных. (3) Это скорее запрос клиента, чем решение архитектуры.
Дело в том, что мы (или я лично) застряли в том, как установить связь между различными модулями. Я прочитал множество различных шаблонов и анти-шаблонов, чтобы сделать это, и почти каждый из них скажет, что API-интеграция через RestTemplate или какой-то специализированный клиент, такой как Feign или Ribbon.
Мне не нравится этот подход по ряду причин, в основном из-за синхронного характера и отсутствия запросов HTTP. Природа HTTP без учета состояния является моей самой большой проблемой, поскольку уровень обслуживания различных модулей может иметь некоторые сильные привязки. Например, действие, которое запускается в модуле A, может иметь последствия для модулей B и C, и все должно координироваться с точки зрения «транзакции». Я действительно не думаю, что HTTP был бы лучшим способом контролировать это!
Часть Java EE внутри меня кричит о том, чтобы использовать какую-то интеграцию служб, такую как EJB или RMI, или что-то, что не использует HTTP в конце. Для меня было бы гораздо более «естественно» подключить определенную Службу к модулю B внутри модуля A и быть уверенным, что они участвуют вместе в транзакции.
Еще одна вещь, которую необходимо подчеркнуть, заключается в том, что для нашего клиента недостаточно таких парадигм, как возможные несоответствия в базе данных, поскольку они имеют дело с некоторыми серьезными данными. ТАК, «Я обещаю приложить все усилия с данными» не очень хорошо здесь.
Время вопроса:
Является ли эта «интеграция услуг» действительно полезной при работе с «Микросервисами»? Или «Интеграция ресурсов» выигрывает?
Кажется, что Spring, например, предоставляет Spring Integration для обмена сообщениями между сервисами, как это делает технология, подобная EJB. Это лучший способ интегрировать эти услуги? Я что-то упустил?
PS: Вы можете называть мои «Микросервисы» «Микролитами», как мы обычно называем их здесь. :)