前言
本文主要介绍了多租户的相关概念和实现原理,具体的实现相信你看完博客之后自己就知道怎么去写了,如果还是不了解的话,欢迎留言,博主会补充对应的代码实现。
什么是多租户
你们公司研发一套学生管理系统,现在将这套系统出售不同的学校,每个学校根据自己的需要选择需要的功能,如果每个学校都部署一套系统,那么将会浪费掉很多服务器资源,那么可不可以只部署一套,然后使用技术手段在物理或逻辑将不同的学校进行功能和数据隔离?答案当然是可行的,多租户模式就是解决这个问题,即**单个产品实例为多个用户提供服务,用户可按需购买使用产品资源,用户数据相互隔离。**多租户模式在各种应用程序中都有广泛应用,包括软件即服务(SaaS)应用程序、云计算平台、数据库系统等。
关键概念
- 租户(Tenant): 租户是指系统中的一个独立实体,可以是一个组织、一个公司、一个客户等。每个租户在系统中拥有独立的资源和数据。
- 隔离性(Isolation): 多租户系统通过提供逻辑或物理隔离来确保租户之间的互相影响最小化。这可以包括数据库隔离、安全隔离、命名空间隔离等。
- 共享资源(Shared Resources): 多租户系统通过共享相同的应用程序实例和基础设施来实现效率和经济性。
- 定制性(Customization): 多租户系统通常支持对每个租户进行定制,以适应其独特的需求和配置。
数据隔离模式
- 共享数据表,租户ID隔离
所用用户共享同一个数据库、同一个Schema,但是租户之间的数据隔离性通过在数据表中添加TenantID属性进行实现,登陆哪个租户就通过ID查询到对应租户的数据。
- 共享数据库,Schema隔离
多个租户或所有租户共享数据库,但为每一个租户提供了一个Schema的方式,一定程度的逻辑数据隔离,可以满足较高程度的安全性保障,但是恢复数据比较困难,因为会牵扯到其他的数据。
- 独立数据库
该模式下就是一个租户一个数据库,隔离级别最高,系统开发时根据租户动态进行数据源切换,获取对应租户的数据库实例,大大的简化了数据模型,便于扩展,数据恢复简单,但是扩大的数据库服务器的成本。
租户 ID | Schema | 数据库 | |
---|---|---|---|
共享形式 | 表 | 数据库 | MySQL 服务 |
区分方式 | 租户 ID 字段 | 每个租户对应一个 Schema | 每个租户对应一个数据库实例 |
前置操作 | 定义租户 ID 或租户关联表 | 为每个租户建立 Schema(具有相同的表) | 为每个租户建立数据库(具有相同的 Schema 和表) |
操作 | 根据租户 ID 筛选数据 | 根据租户动态切换数据源,访问相应 Schema | 根据租户动态切换数据源,访问相应数据库实例 |
关键技术
数据路由
不同的隔离方式采用不同的数据路由方式,如果是租户id,在SQL查询条件后面追加 where tenant_id = ? ANDstu_id = ?
,如果是Schema或数据库,使用Spring AOP根据租户id动态切换数据源。
租户管理
如何解决重复租户的问题?比如一个学生从A学校转入B学校,两个学校都有其租户信息,当学生在登录的使用系统是时候,怎么判断其租户信息?可以现使用学校租户id进行数据范围定位,然后使用学生租户id进行学生信息的定位,虽然同一个学生可能在两家学校有过对应的信息,但是学校+学生的信息是唯一的。