小编典典

Making spring-data-mongodb multi-tenant

spring

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

“你必须创建自己的RepositoryFactoryBean。这是Spring Data MongoDB参考文档中的示例。你仍然必须实现自己的MongoTemplate并延迟或删除sureIndexes()调用。但是你必须重写一些类以确保你调用的是MongoTemplate,而不是Spring。”

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


阅读 526

收藏
2020-04-13

共1个答案

小编典典

这里有很多种为猫皮的方法。基本上,所有这些都归结为你要应用该租约的级别。

基本
基本方法是在每个线程的基础上绑定某种标识客户的密钥,以便你可以找到当前执行线程所处理的客户。通常,这可以通过填充ThreadLocal一些与身份验证相关的信息来实现,因为你通常可以从已登录的用户派生租户。

现在,如果有的话,可以在哪里选择一些租户知识。让我简要概述最常见的方法:

数据库级别的多租户
为多个客户端分离数据的一种方法是每个租户拥有单独的数据库。Spring Data MongoDB为此的核心抽象是MongoDBFactory接口。此处最简单的方法是SimpleMongoDbFactory.getDb(String name)使用数据库名称覆盖并调用父方法,例如,通过租户前缀等丰富。

集合级别的多租户
另一种选择是拥有租户特定的集合,例如通过租户前缀或后缀。实际上,可以通过在@Document注释的collectionName属性中使用Spring Expression语言(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属性以查找有关要与之交互的集合。

2020-04-13