У меня была такая же проблема несколько месяцев назад go, и я хотел поделиться тем, как я ее решил.
Решение 1: сделать это самостоятельно
Spring делает не предоставлять готовые решения для этой проблемы. Несколько месяцев go я создал доказательство того, как ее решить, и только что опубликовал пример проекта на Github.
spring-mongodb-multi-tenancy-example
Вкратце: я создал пользовательский MultiTenancyReactiveMongoTemplate
, который внутренне делегирует фактическому ReactiveMongoTemplate
на основе tenantId из subscriberContext . tenantId извлекается из заголовка http-запроса в пользовательском WebFilter, который помещает его в subscriberContext .
Этот обходной путь работает в большинстве случаев, а также поддерживает автоматическое создание индекса и использование ReactiveMongoRepository
.
Но также имеет некоторые ограничения, так как транзакции, IndexOps для MultiTenancyReactiveMongoTemplate
или ReactiveGridFSTemplate
не работают с предоставленным решением. Некоторые вещи могут быть реализованы с помощью других делегирующих «шаблонов», но некоторые вещи никогда не будут работать, поскольку эти операции просто возвращают скалярные значения (без Publisher
), и в этих случаях нет доступа к subscriberContext.
Если вам не нужны эти функции, вы, вероятно, могли бы go с этим решением.
Решение 2:
Вы раскручиваете и настраиваете экземпляры службы для каждого арендатора / клиента и ставите обратный прокси «до» этих сервисов. Обратный прокси-сервер решает, какой сервис следует использовать для обработки запроса. Обратный прокси может быть реализован очень просто, например, Spring Cloud Gateway , который позволяет легко реализовать предикаты , которые решают (например, на основе токена аутентификации), какую службу следует использовать.
С такими технологиями, как CloudFoun dry или Kubernetes, уже нетрудно организовать развертывание этих служб, определяемых арендатором c, и это решение также упрощает мониторинг, оповещение или оповещение специалиста арендатора c. равномерный биллинг.
Мы выбрали решение 2 , потому что в целом это было проще и масштабировалось для нас лучше.