Making spring-data-mongodb multi-tenant
在去年8 月的一篇文章中,sbzoom提出了一种使spring-data-mongoDB多租户的解决方案:
“你必须创建自己的RepositoryFactoryBean。这是Spring Data MongoDB参考文档中的示例。你仍然必须实现自己的MongoTemplate并延迟或删除sureIndexes()调用。但是你必须重写一些类以确保你调用的是MongoTemplate,而不是Spring。”
有没有人实现这个或类似的东西?
回答:
这里有很多种为猫皮的方法。基本上,所有这些都归结为你要应用该租约的级别。
基本
基本方法是在每个线程的基础上绑定某种标识客户的密钥,以便你可以找到当前执行线程所处理的客户。通常,这可以通过填充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属性以查找有关要与之交互的集合。
以上是 Making spring-data-mongodb multi-tenant 的全部内容, 来源链接: utcz.com/qa/413439.html