Задать вопрос
@Wan-Derer
Зобанели на Хабре, волки́ ;((

Подскажете по архитектуре «мультисервисного» приложения?

Всем привет!
Думаю надо архитектурой приложения (Spring Boot, сборка на Maven).
Приложение будет предоставлять несколько WEB-сервисов, за каждый будет отвечать отдельный микросервис :) Но все они будут обращаться к одной базе данных.
Я хочу сделать микросервис (или модуль?), который абстрагирует БД. Т.е. он умеет читать (пока только читать, а в перспективе и писать, и кэшировать запросы) записи из БД и раздавать их другим частям приложения. Все остальные части ничего не знают про БД, а пользуются готовыми объектами.
Как это лучше сделать? Очевидный путь - микросервис и раздача по REST. Но допустим, у меня БД на 1000 таблиц (плюс ещё таблицы взаимосвязаны что порождает вложенные Java-объекты). Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....
М.б. есть менее обезьяний способ? :) Думать какие-то универсальные методы с подсовыванием нужных классов и Reflection? Сделать его как модуль (модули из Java-9)? Или как-то ещё?
Наверняка я не первый кто столкнулся с такой задачей. Как это вообще принято делать?
  • Вопрос задан
  • 169 просмотров
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 3
2ord
@2ord
НО! Они все пользуются одной и той же БД, из которой "черпают" данные "общего назначения": юзеры, ассеты, события и пр.

Вот я и хочу "общую часть" вынести куда-то отдельно. И спрашиваю как это принято делать: библиотека? модуль? сервис?
Можно сделать как подключаемую библиотеку (пакет Java), вынеся всё в ядро самое необходимое. Вокруг библиотеки ядра могут быть созданы какие-то библиотеки-обвески. Репозиториев библиотек может быть несколько, для простоты. Каждая библиотека может иметь свою версию и использоваться монолитом при сборке.

Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....
Ну зачем так? Нет смысла дробить даже на десятки, не говоря уже о тысячах.

Начните с разделения по модулям, где у каждого компонента своя зона ответственности и нет переплетений зависимостей с другими компонентами.
Нужно знать больше подробностей о предметной области и текущей архитектуре проекта, чтобы дать дополнительные советы.
Ответ написан
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....

Зачем такой ужас. Делай только те репозитарии которые реально задействованы в бизнес-задачах.
Из личного опыта могу сказать что если приложение спроектировано по умному - то ему не нужно
выделять каждую таблицу в Entity.
Ответ написан
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Приложение будет предоставлять несколько WEB-сервисов, за каждый будет отвечать отдельный микросервис :) Но все они будут обращаться к одной базе данных.

Может быть вам нужны не микросервисы, а distributed monolith? Ну и реализовать паттерн shared database access

Я хочу сделать микросервис (или модуль?), который абстрагирует БД. Т.е. он умеет читать (пока только читать, а в перспективе и писать, и кэшировать запросы) записи из БД и раздавать их другим частям приложения. Все остальные части ничего не знают про БД, а пользуются готовыми объектами.

Тут можно и про SAGA задуматься.

Но допустим, у меня БД на 1000 таблиц (плюс ещё таблицы взаимосвязаны что порождает вложенные Java-объекты). Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....

Честно, не уловил сути между количеством таблиц в БД и количеством репозиториев. Но если что можно же монорепо сделать.

Думаю, вам не нужны микросервисы. Вам понадобится monolith, ну или максимумdistributed monolith.
Много чего можно вынести в отдельные модули. Например, создать модуль persistence и вынести DAO туда
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы