@revukvr

Как правильно сделать взаимодействия между модулями в Java Spring?

Хочу научится писать микросервисы java. Есть проект на котором хочу всё это организовать. Но проект не большой им пользуются человек 40. Сейчас это монолит. На страницах интернета нашёл что для таких небольших проектов как у меня делают не микросервисы, а микросервисный монолит. Разбил проект на микросервисы (всего 11). Один из которых занимается работой с Амосрм, а второй главный который создаёт некоторые записи в БД и анализирует их. Модули общаются между собой не Rest, а напрямую вызывают метод контроллера другого модуля. Так получается, что модуль амо должен взаимодействовать с главным модулем и наоборот. Как правильно в gradle подключить эти модули? и как в целом должны взаимодействовать модули в такой архитектуре? Иначе если я подключаю в главном модуле амо и наоборот, то выбрасывает ошибку:

Circular dependency between the following tasks:
:amocrm:compileJava
\--- :datadeal:compileJava
     \--- :amocrm:compileJava (*)


dependencies { //datadeal
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation project(':amocrm')
}

dependencies { //amocrm
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation project(':datadeal')
}


Пример контроллера

@Controller
@AllArgsConstructor
public class OrderControllerImpl implements OrderController {

    private final OrdersService ordersService;

    @Override
    public void sendOrder(Long id) {
        ordersService.sendOrder(id);
    }

}
  • Вопрос задан
  • 1740 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Предположу, что у вас все-таки реализован не микросервисный монолит, а монолитная архитектура. Вы лишь разделили монолитное приложение на модули и подключили их в gradle. С другой стороны - а нужен ли вам микросервисный монолит или микросервис вообще, если приложение довольно маленькое и им пользуются всего 40 человек.
Если речь идет просто о взаимодействии модулей монолитного приложения, то в соответствующем gradle файле модуля подключаете нужный модуль и импортируете нужные сервисы, классы и т.д.
Главное обратите внимание, чтобы не было циклической зависимости, которая у вас указана тут:
Circular dependency between the following tasks:
:amocrm:compileJava
\--- :datadeal:compileJava
     \--- :amocrm:compileJava (*)

Информация по теме -
https://reflectoring.io/spring-boot-gradle-multi-m...
https://spring.io/guides/gs/multi-module/
Циклическая зависимость возникает, когда модуль А ссылается на модуль В, а модул В ссылается на модуль А. Ни gradle, ни maven не могут решить эту проблему, так как для сборки одного модуля нужен другой модуль, а для другого первый. Также это говорит о том, что возможно проект был несовсем корректно разделен на модули. Можно попробовать создать модуль C, и вынести общие для модулей A & B классы в него. А затем добавить зависимость модуля A от C, а модуля B тоже от C. Таким образом циклической зависимости не будет. Также обратите внимание на рекомендации по организации структуры Spring приложения, которая указана в оф. документации на их сайте.

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

Если уж вам понадобилось делить проект на микросервисы, то как по мне лучше реализовать полноценную микросервисную архитектуру через API Gateway. Соответственно, связать модули через REST. Тут уже понадобится Spring Cloud API Gateway, Spring Cloud Netflix Eureka Client & Server и т.д.

Возможно, что есть подводные камни, о которых я не знаю. Надеюсь, что коллеги поопытнее более подробно ответят на данный вопрос.
А так вот, небольшая статья по данной тематике: https://habr.com/ru/post/496934/
Вдруг, вам будет интересно - небольшой вводный курс по Spring Cloud, Eureka, Zulu и т.д. - https://www.udemy.com/course/spring-boot-microserv...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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