spring boot如何做多租户?

1.如果每个租户一个数据库,如果有任何表结构变动,维护起来很麻烦。
2.如果所有租户一个数据库,如果有任何表结构变动,维护起来很方便。
3.如果任何crud都手动筛选租户id,很麻烦。
我的想法是拦截sql,然后解析sql,自动加上租户字段的筛选。
不知道有什么好的开源项目可以直接使用。

阅读 1.5k
avatarAI BotBETA

在Spring Boot中实现多租户(Multi-Tenancy)时,确实需要考虑多种策略来平衡数据隔离、维护便利性和性能等因素。你提到的几种策略以及你的想法都是有效的方向,下面我会分别给出一些建议和可能的开源项目支持。

1. 每个租户一个数据库

  • 优点:数据高度隔离,避免了数据泄露的风险;表结构变更可以针对特定租户进行,不影响其他租户。
  • 缺点:数据库管理复杂,成本较高;表结构变更时维护成本高。

实现方式

  • 使用Spring Data JPA或MyBatis等ORM框架时,可以通过配置不同的数据源(DataSource)来实现,每个租户对应一个数据源。
  • 可以使用如Apache ShardingSphere、Hibernate Shards等中间件来管理多个数据源。

2. 所有租户一个数据库

  • 优点:数据库管理简单,成本低;表结构变更容易,维护方便。
  • 缺点:数据隔离性较弱,需要更复杂的查询逻辑来区分租户数据。

实现方式

  • 在数据库表中添加租户ID字段(Tenant ID),所有查询都需要通过此字段进行过滤。
  • 可以使用Spring AOP(面向切面编程)或Spring Data的拦截器来自动在查询中添加租户ID条件。

3. SQL拦截与解析

你的想法非常接近于使用AOP(面向切面编程)或数据库中间件来实现SQL的拦截与解析,自动添加租户ID筛选条件。

实现方式

  • Spring AOP:定义一个切面(Aspect),拦截所有数据库操作,并修改SQL语句,添加租户ID的过滤条件。
  • 数据库中间件:使用如Apache ShardingSphere等数据库中间件,它们支持在SQL执行前进行改写,自动添加租户ID等条件。

开源项目推荐

  • Apache ShardingSphere:这是一个开源的数据库分片、读写分离和数据加密的中间件,支持多种数据库。它可以很容易地实现多租户的数据隔离,通过规则配置自动在SQL中添加租户ID的过滤条件。
  • MyBatis-Plus:虽然MyBatis-Plus本身不直接支持多租户,但它提供了强大的插件机制,你可以通过自定义插件来实现SQL拦截和租户ID的自动添加。

结论

根据你的需求,如果追求数据的高度隔离且可以接受较高的维护成本,可以选择每个租户一个数据库的策略。如果希望简化数据库管理和表结构变更的维护,可以考虑所有租户一个数据库并使用AOP或数据库中间件来自动处理租户ID的筛选。Apache ShardingSphere是一个值得考虑的开源项目,它提供了灵活的数据分片策略和SQL改写功能,非常适合用于多租户场景。

2 个回答

是的,可以拦截 SQL 并处理。MyBais-Plus 提供了多租户的组件,只需要实现拦截器即可达到你的预期。

但实际上,多租户影响的点不止是关系数据库而已。

比如你的项目是微服务,或者需要使用第三方的服务,那么是不是还需要把租户标识传递下去?如果你的存储不止是关系数据库,使用了 Redis、MongoDB 等,是不是也要在中间件的交互上也携带租户标识?

对于三方服务,尚可以在请求交互时使用 OkHttp 的拦截器来在请求之前在头中置入租户标识。可是 Redis、MongoDB 或是 ES 等,目前我是没发现好的办法。

想是直接手写sql mapper不太好搞,如果是用java代码封装sql不是直接在xml写sql,则简单多了,取当前用户的租户号,自动加上查询tenant_code=当前用户租号. 比如mybatis-plus由于有可以用java代码来写sql,则很容易做到.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏