在去年8月的一次post会议上,sbzoom提出了一个解决方案,让spring-data-mongoDB成为多租户: “您必须创建自己的RepositoryFactoryBean。下面是来自Spring Data MongoDB参考文档的示例。您仍然必须实现自己的MongoTemplate,并延迟或删除ensureIndexes()调用。但您必须重写一些类,以确保调用您的MongoTemplate而不是Spring的MongoTemplate。” 有人实现了这个或类似的东西吗?
为多个客户端分离数据的一种方法是为每个租户提供单独的数据库。Spring Data MongoDB对此的核心抽象是MongoDBFactory接口。这里最简单的方法是覆盖SimpleMongoDbFactory.getDb(String name)并使用数据库名称调用父方法,例如通过租户前缀或类似的内容进行丰富。
4条答案
按热度按时间hsgswve41#
这里有很多种方法可以解决这个问题,基本上都归结为您希望在哪个级别上应用租约。
基础知识
基本的方法是在每个线程的基础上绑定某种标识客户的键,这样你就可以找到当前执行线程处理的客户。这通常是通过用一些与身份验证相关的信息填充
ThreadLocal
来实现的,因为你通常可以从登录的用户派生租户。现在,如果这是适当的,有几个选项,在哪里应用租户的知识。让我简要概述最常见的:
数据库级别的多租户
为多个客户端分离数据的一种方法是为每个租户提供单独的数据库。Spring Data MongoDB对此的核心抽象是
MongoDBFactory
接口。这里最简单的方法是覆盖SimpleMongoDbFactory.getDb(String name)
并使用数据库名称调用父方法,例如通过租户前缀或类似的内容进行丰富。集合级别的多租户
另一个选择是拥有特定于租户的集合,例如通过租户前缀或后缀。实际上,可以通过在
@Document
注解的collectionName
属性中使用Spring表达式语言(SpEl)来利用此机制。首先,通过Spring bean公开租户前缀:然后在你的域中使用SpEL类型
@Document
Map:SpEl允许您通过名称引用Springbean,并在它们上执行方法。
MongoTemplate
(以及存储库抽象)将使用文档类的Map元数据,Map子系统将评估collectionName
属性,以找出要与之交互的集合。eivgtgni2#
我有一个类似于奥利弗Gierke的方法,至少在数据库级别。https://github.com/Loki-Afro/multi-tenant-spring-mongodb你应该能够做这样的事情:
mnemlml83#
用于Spring Boot2.3.3
覆盖doGetMongoDatabase有助于实现多租户
https://github.com/jose-m-thomas/mongo_multi_tenancy_spring_boot_2_3_3
guykilcj4#
具有Sping Boot + MongoDB + Spring MVC(具有共享/全局数据库配置)的全功能多租户/租户。
https://github.com/arun2pratap/multitenant-spring-mongodb