#spring #spring-boot #multi-tenant #spring-session
#весна #spring-загрузка #многопользовательский #spring-сессия
Вопрос:
Я пытаюсь создать загрузочное приложение spring (масштабируемое по своей природе) с гибернацией для нескольких арендаторов (подход к базе данных для каждого арендатора), эта часть работает нормально. Я запускаю это приложение в кластере, я сталкиваюсь с проблемами в HTTP-сеансах (необходимо реплицировать HTTP-сеансы на другие узлы). Для этого я попытался использовать Spring JDBC Session, но столкнулся с проблемами при ее настройке.
Я только что включил зависимость весеннего сеанса в файл gradle и применил аннотацию @EnableJdbcHttpSession к моим конфигурациям приложений.java-файл.
Проблема, с которой я сталкиваюсь, заключается в том, что она выдает мне ошибку, что для некоторых компонентов требуется компонент с именем ‘DataSource’, я тоже пытался это объявить.
Я веду карту источников данных, в которой хранится источник данных каждого арендатора.
После запуска приложения карта каким-то образом содержит только один источник данных, который является источником по умолчанию (для которого я создал компонент с именем ‘DataSource’).
Я не уверен, чего мне здесь не хватает, или даже поддерживает многопользовательскую работу Spring-Session или нет.
В приведенном ниже коде показано, как я создаю карту источника данных, которую я дополнительно инициализирую при запуске приложения:
@Bean(name = "dataSourceMap" )
public Map<String, DataSource> dataSourceMap() {
Map<String, DataSource> datasources = new HashMap<>();
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setPoolName("defaultDataSourcePool");
hikariConfig.setMaximumPoolSize(5);
hikariConfig.setMinimumIdle(5);
hikariConfig.setJdbcUrl(url);
hikariConfig.setUsername(username);
hikariConfig.setPassword(password);
datasources.put(defaultTenant, new HikariDataSource(hikariConfig));
return datasources;
}
Аналогичным образом я также определил компонент, который возвращает источник данных по умолчанию.
Я ожидаю, что для каждого арендатора будут таблицы сеансов, в которых будут храниться данные сеанса отдельно. Может кто-нибудь, пожалуйста, предложить выход из этого? или, может быть, если бы кто-нибудь мог поделиться некоторыми примерами базы кода с такой интеграцией, это было бы здорово.
Комментарии:
1. Ваша карта существует только локально в каждом экземпляре службы. Вместо репликации HTTP-сеансов на всех узлах, я думаю, вам следует рассмотреть возможность реализации токена Oauth2 JWT. Было бы намного проще и естественнее обрабатывать многопользовательскую.
2. Многопользовательская аренда уже работает нормально, проблема связана с весенней сессией. Я хочу реплицировать HTTP-сеансы на другие узлы кластера.