创建spring-data-mongodb多租户

mctunoxg  于 2022-11-21  发布在  Spring
关注(0)|答案(4)|浏览(174)

在去年8月的一次post会议上,sbzoom提出了一个解决方案,让spring-data-mongoDB成为多租户:
“您必须创建自己的RepositoryFactoryBean。下面是来自Spring Data MongoDB参考文档的示例。您仍然必须实现自己的MongoTemplate,并延迟或删除ensureIndexes()调用。但您必须重写一些类,以确保调用您的MongoTemplate而不是Spring的MongoTemplate。”
有人实现了这个或类似的东西吗?

hsgswve4

hsgswve41#

这里有很多种方法可以解决这个问题,基本上都归结为您希望在哪个级别上应用租约。

基础知识

基本的方法是在每个线程的基础上绑定某种标识客户的键,这样你就可以找到当前执行线程处理的客户。这通常是通过用一些与身份验证相关的信息填充ThreadLocal来实现的,因为你通常可以从登录的用户派生租户。
现在,如果这是适当的,有几个选项,在哪里应用租户的知识。让我简要概述最常见的:

数据库级别的多租户

为多个客户端分离数据的一种方法是为每个租户提供单独的数据库。Spring Data MongoDB对此的核心抽象是MongoDBFactory接口。这里最简单的方法是覆盖SimpleMongoDbFactory.getDb(String name)并使用数据库名称调用父方法,例如通过租户前缀或类似的内容进行丰富。

集合级别的多租户

另一个选择是拥有特定于租户的集合,例如通过租户前缀或后缀。实际上,可以通过在@Document注解的collectionName属性中使用Spring表达式语言(SpEl)来利用此机制。首先,通过Spring bean公开租户前缀:

@Component("tenantProvider")
 public class TenantProvider {

   public String getTenantId() {
     // … implement ThreadLocal lookup here
   }
 }

然后在你的域中使用SpEL类型@DocumentMap:

@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
 public class Account { … }

SpEl允许您通过名称引用Springbean,并在它们上执行方法。MongoTemplate(以及存储库抽象)将使用文档类的Map元数据,Map子系统将评估collectionName属性,以找出要与之交互的集合。

eivgtgni

eivgtgni2#

我有一个类似于奥利弗Gierke的方法,至少在数据库级别。https://github.com/Loki-Afro/multi-tenant-spring-mongodb你应该能够做这样的事情:

MultiTenantMongoDbFactory.setDatabaseNameForCurrentThread("test");
        this.personRepository.save(createPerson("Phillip", "Wirth", ChronoUnit.YEARS.between(
                LocalDate.of(1992, Month.FEBRUARY, 3),
                LocalDate.now())));

        System.out.println("data from test: " + this.personRepository.findAll());
//        okay? fine. - lets switch the database
        MultiTenantMongoDbFactory.setDatabaseNameForCurrentThread("test666");

//        should be empty
        System.out.println("data from test666: " + this.personRepository.findAll());
mnemlml8

mnemlml83#

用于Spring Boot2.3.3
覆盖doGetMongoDatabase有助于实现多租户

protected MongoDatabase doGetMongoDatabase(String dbName) {   
}

https://github.com/jose-m-thomas/mongo_multi_tenancy_spring_boot_2_3_3

guykilcj

guykilcj4#

具有Sping Boot + MongoDB + Spring MVC(具有共享/全局数据库配置)的全功能多租户/租户。
https://github.com/arun2pratap/multitenant-spring-mongodb

相关问题