11

在去年 8月的一篇文章中, sbzoom提出了一种使 spring-data-mongoDB 多租户的解决方案:

“您必须制作自己的 RepositoryFactoryBean。这是Spring Data MongoDB Reference Docs中的示例。您仍然需要实现自己的 MongoTemplate 并延迟或删除 ensureIndexes() 调用。但是您必须重写一些类来确保调用您的 MongoTemplate 而不是 Spring 的。”

有没有人实现这个或类似的东西?

4

4 回答 4

20

有很多方法可以在这里给猫剥皮。这基本上都归结为您希望在哪个级别应用租约。

基本

基本方法是在每个线程的基础上绑定某种标识客户的密钥,以便您可以了解当前执行线程处理的客户。这通常是通过填充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
   }
 }

@Document然后在您的域类型映射中使用 SpEL :

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

SpEl 允许您按名称引用 Spring bean 并在它们上执行方法。MongoTemplate(因此存储库抽象可传递)将使用文档类的映射元数据,并且映射子系统将评估collectionName属性以找出要与之交互的集合。

于 2013-05-01T20:34:03.053 回答
4

我对 Oliver 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());
于 2014-06-13T12:42:30.223 回答
2

对于springboot 2.3.3

覆盖 doGetMongoDatabase 有助于实现多租户

protected MongoDatabase doGetMongoDatabase(String dbName) {   
}

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

于 2020-09-07T17:17:57.023 回答
1

使用 Spring Boot + MongoDB + Spring MVC 和共享/全局数据库配置的全功能多租户/租户。

https://github.com/arun2pratap/multitenant-spring-mongodb

在此处输入图像描述

于 2021-01-04T15:05:00.660 回答