代码已经上传到码云:gitee.com/lezaiclub/s…欢迎白嫖
引言
今天我们来聊聊多组户 其实多租户主要讲的是数据隔离,即每个企业或用户都享有自己的独立数据,不和其他人的数据相互掺合,别人也是无法获取我们自己的数据的。 多租户在实现上主要有三种方式:
独立数据库
这种方式最简单明了,每个企业或用户在平台上通过独立的数据库来隔离自己的数据,这是在物理上达到了数据的隔离,这也是它的优点所在,但是他的缺点是,为每个企业或用户创建独立的数据库,成本非常大,而且空间的利用率也不高,造成严重的浪费。总结下:
- 优点:数据完全隔离、安全性高
- 缺点:成本高,数据库多,难以维护
同一数据库,不同表
这种方式是在逻辑上进行隔离,不同用户的数据都在同一个数据库中,但是使用不同的表来存储不同用户的数据,实现数据的隔离,这种方式相对上面,成本下降了,也同样达到了数据隔离
同一数据库,同一张表,通过字段区分
这种方式相对上面两种,成本就更加少了,仅仅通过字段就可以区分不同的数据,这种方式维护简单,成本少,但是进行数据导出和迁移,却是一种大大的麻烦,总结下
- 优点:维护方便、成本低、实现简单,维护的租户数量可以有很多
- 缺点:数据好迁移,数据没有完全做到隔离
通过对比上面三种方式,我们已经清楚了每种实现方案的区别及其他们的优劣势,在本文,我们将通过集成mybatisPlus,实现第三种方式,来实现多租户。
环境搭建
基于上一节的环境,我们已经搭集成了mybatisPlus的环境。 现在我们在member表中新增一个字段tenant_id,用来保存租户信息,同样如果你的表中需要维护租户信息,也需要创建同样的一个字段
1 | sql复制代码ALTER TABLE `member` |
coding
添加请求上下文辅助类
这个类主要是保存当前请求用户的的信息,使用threadlocal来实现,和当前请求线程绑定
1 | typescript复制代码package com.aims.mybatisplus.conf; |
添加认证拦截器
这个拦截器主要是获取请求头中的租户id,然后放到上下文中,供mybatisPlus获取
1 | java复制代码package com.aims.mybatisplus.interceptor; |
配置拦截器
1 | java复制代码package com.aims.mybatisplus.interceptor; |
添加mybatisPlus配置类
该类主要是配置mybatisPlus拦截器,用来配租户ID字段,哪些表可以获取租户处理,租户ID从上下文中获取
1 | less复制代码package com.aims.mybatisplus.conf; |
当前目录结构
编写测试接口
注意租户信息需要写在请求头里面的,
1 | typescript复制代码@RestController |
最后
通过上面演示,相信大家应该都已经实现了多组户,后面会有更多mybatisPlus实战教程分享给大家
本文转载自: 掘金