旧系统多租户改造
目标
全站改造,实现多租户隔离
方案
方案一
对所有表添加租户字段,然后基于Mybatis Plus租户插件进行拦截查询、插入
整体改造工作量太大,需要修改所有用到的表结构
方案二
- 添加一张路由表,将所有用户划分到不同的租户下
- 所有查询基于
Mybatis拦截器实现SQL改写
比如原先查询订单信息
select uid,order_id,create_time from order
改写后的SQL为
select o.uid,o.order_id,o.create_time from order o inner join user_rote ur on o.uid = ur.uid
where
ur.user_region in()
这里需要注意要给原表的字段添加别名,因为原表的字段可能会和
user_rote重名导致SQL异常
主要是关联region进行逻辑隔离
-
优点:
- 改动不需要改动表结构,改造量小
- 整体风险可控,通过注解仅拦截可控SQL,不进行全局拦截
-
缺点:
- 复杂SQL需要手动改造
- 对于没有路由健的表无法进行租户隔离
但是SQL改写实现复杂,对复杂的SQL改写不一定能成功
基于项目现状SQL有如下特征:
- 大部分SQL都是单表查询
- 少量关联查询 也是比较标准的关联查询
- 极少复杂统计SQL,这种可以考虑直接改原始SQL,毕竟这种SQL比较少
难点
PageHelper分页拦截问题
普通SQL可以直接添加注解拦截
PageHelper生成的自动分页不行
Mybatis Plus自动分页
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
RPC查询
这种查询仅支持本地查询改造,如果查询为RPC查询,则无法处理
统计查询无法隔离
部分业务的统计数据是直接统计好的,统计表中不存在比如uid,无法通过join进行隔离