这里有很多种为猫皮的方法。基本上,所有这些都归结为你要应用该租约的级别。
基本
基本方法是在每个线程的基础上绑定某种标识客户的密钥,以便你可以找到当前执行线程所处理的客户。通常,这可以通过填充
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属性以查找有关要与之交互的集合。



