Mybatis 技术专题之 MybatisPlus 自带强大功能之多租户插件实现原理和实战分析
http://mp.baomidou.com/guide/tenant.html
前提介绍
一般的程序应用当使用者访问不同,并且进入相对应的程序页面,则会把用户相关数据传输到后台这里。在传输的时候需要带上标识(租户 ID),以便程序将数据进行隔离。当不同的租户使用同一个程序服务,这里就需要考虑一个数据隔离的情况。
什么是多租户技术
多租户技术或称多重租赁技术,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业)共用相同的系统或程序组件,并且确保各用户间数据隔离性。
在一台服务器上运行单个应用实例,它为多个租户(客户)提供服务。从定义中我们可以理解:多租户是一种架构,目的是为了让多用户环境下使用同一套程序,且保证用户间数据隔离。多租户的重点就是同程序下实现多用户数据的隔离。
数据隔离有三种方案:
独立数据库:简单来说就是一个租户使用一个数据库,这种数据隔离级别最高,安全性最好,但是提高成本。
共享数据库、隔离数据架构:多租户使用同一个数据裤,但是每个租户对应一个 Schema(数据库 user)。
共享数据库、共享数据架构:使用同一个数据库,同一个 Schema,但是在表中增加了租户 ID 的字段,这种共享数据程度最高,隔离级别最低。
多租户具体实现
按照综合实际考虑,一般都会采用方案三,即共享数据库,共享数据架构,因为这种方案服务器成本最低,但是提高了开发成本。
MybatisPlus 实现逻辑
Mybatis-plus 实现多租户方案
Mybatis-plus 就提供了一种多租户的解决方案,实现方式是基于分页插件(拦截器)进行实现的;
第一步:应用添加维护一张 tenant(租户表),需要进行隔离的数据表上新增租户 id,例如,现在有数据库表(user)如下:
将 tenantId 视为租户 ID,用来隔离租户与租户之间的数据,如果要查询当前服务商的用户,SQL 大致如下:
第二步:实现 TenantHandler 接口并实现它的方法:
PreTenantHandler 实现 TenantHandler
第三步:配置 mybatisPlus 的分页插件配置
租户相关的表,我们都需要不厌其烦的加上 AND t.tenantId = ?查询条件,稍不注意就会导致数据越界,数据安全问题让人担忧。好在有了 MybatisPlus 这个神器,可以极为方便的实现多租户 SQL 解析器。
核心配置:TenantSqlParser
配置好之后,不管是查询、新增、修改删除方法,MP 都会自动加上租户 ID 的标识,测试如下:
运行 sql 实例:
注:特定 SQL 过滤,如果在程序中,有部分 SQL 不需要加上租户 ID 的表示,需要过滤特定的 sql,可以通过如下两种方式:
在配置分页插件中加上配置 ISqlParserFilter 解析器,配置 SQL 很多,比较麻烦,不建议;
通过租户注解 @SqlParser(filter = true) 的形式,目前只能作用于 Mapper 的方法上:
ApiContext
版权声明: 本文为 InfoQ 作者【浩宇天尚】的原创文章。
原文链接:【http://xie.infoq.cn/article/dd8ac8438d31d24c332989392】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论 (8 条评论)