SpringApplicationBuilder для объединения небольших приложений SpringBoot (модульный Monolith) - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать «основное» приложение SpringBoot, которое должно состоять из множества небольших независимых приложений SpringBoot. Основное приложение взаимодействует с каждым из небольших приложений SpringBoot для запроса данных или их изменения. Каждое из небольших приложений выполняет определенный домен. Например, приложение зависимости / SpringBoot для управления пользователями, передачи почты, управления продуктами, выполнения заказов. Каждое из небольших приложений использует собственную базу данных, которая отделена от других.

Я добавил небольшие приложения в качестве зависимости от моего основного приложения. Сейчас я сталкиваюсь с проблемой или с тем фактом, что main создает все компоненты из зависимых приложений. Я знаю, как работает SpringBoot. Проблема в том, что в каждой зависимости есть несколько компонентов или классов с одинаковыми именами. Поэтому запуск приложения просто приводит к сбою, потому что есть бины с одинаковыми именами, которые являются правильными Далее основной пытается создать экземпляр подключения к БД Hikari, но не должен иметь никакого соединения с БД. Я думаю, что это потому, что другие приложения имеют подключение БД. Поэтому main также пытается создать соединение с БД.

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

Есть ли способ, которым каждое из приложений Spring Boot просто использует свой собственный компонент Beans, а основное приложение может просто вызывать определенный интерфейс / API других? Точно так же, как другие сервисы предоставляют REST API, но без предоставления REST API.

Будет ли SpringBootApplicationBuilder (https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/builder/SpringApplicationBuilder.html) использование детей / братьев и сестер способом достижения моей цели? Или я что-то упускаю и нет пути к достижению цели?

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Возможно, вы можете попытаться разделить модули, используя контекстную иерархию, но, конечно, как @Alex сказал, вы должны позаботиться о правильном сканировании компонентов:

public class Bootstrap {

    private static final Logger LOGGER = LoggerFactory.getLogger(Bootstrap.class);

    private static final String CONFIG_LOCATION = "spring.config.location=classpath:/config/";

    public static void main(String[] args) {

        SpringApplicationBuilder parentBuilder = new SpringApplicationBuilder(CtxParent.class).web(WebApplicationType.NONE);

        ConfigurableApplicationContext context =
            parentBuilder.parent(CtxParent.class)
                .web(WebApplicationType.SERVLET)
                .properties("spring.config.name=application",CONFIG_LOCATION).run(args);
            parentBuilder.child(CtxModuleOne.class)
                .web(WebApplicationType.NONE) // whatever
                .properties("spring.config.name=module-one",CONFIG_LOCATION).run(args);
            parentBuilder.sibling(CtxModuleTwo.class)
                .web(WebApplicationType.NONE) // whatever
                .properties("spring.config.name=module-two",CONFIG_LOCATION).run(args);

    }
}
0 голосов
/ 01 мая 2020

В случае дочерних элементов Spring Boot - будут потенциальные конфликты в ресурсах и привязках: вы все равно не сможете привязать 2 экземпляра контейнера сервлета к одному и тому же порту, поэтому необходимо разделить их.

Думаю, будет лучше использовать одно приложение Spring Boot и использовать выделенные классы с аннотацией @Configuration для дочернего «приложения» в качестве отправной точки:

@Configuration
public class SomeModuleConfig {

@Bean
public Bean myModuleBean() {}

}

Чтобы избежать глобального сканирования, вы можете играть с @ComponentScan включают / исключают фильтры: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html

...