在去年 8月的一篇文章中, sbzoom提出了一种使 spring-data-mongoDB 多租户的解决方案:
“您必须制作自己的 RepositoryFactoryBean。这是Spring Data MongoDB Reference Docs中的示例。您仍然需要实现自己的 MongoTemplate 并延迟或删除 ensureIndexes() 调用。但是您必须重写一些类来确保调用您的 MongoTemplate 而不是 Spring 的。”
有没有人实现这个或类似的东西?
在去年 8月的一篇文章中, sbzoom提出了一种使 spring-data-mongoDB 多租户的解决方案:
“您必须制作自己的 RepositoryFactoryBean。这是Spring Data MongoDB Reference Docs中的示例。您仍然需要实现自己的 MongoTemplate 并延迟或删除 ensureIndexes() 调用。但是您必须重写一些类来确保调用您的 MongoTemplate 而不是 Spring 的。”
有没有人实现这个或类似的东西?
有很多方法可以在这里给猫剥皮。这基本上都归结为您希望在哪个级别应用租约。
基本方法是在每个线程的基础上绑定某种标识客户的密钥,以便您可以了解当前执行线程处理的客户。这通常是通过填充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
属性以找出要与之交互的集合。
我对 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());
对于springboot 2.3.3
覆盖 doGetMongoDatabase 有助于实现多租户
protected MongoDatabase doGetMongoDatabase(String dbName) {
}
https://github.com/jose-m-thomas/mongo_multi_tenancy_spring_boot_2_3_3
使用 Spring Boot + MongoDB + Spring MVC 和共享/全局数据库配置的全功能多租户/租户。