跳到主要内容

旧系统多租户改造

目标

全站改造,实现多租户隔离

方案

方案一

对所有表添加租户字段,然后基于Mybatis Plus租户插件进行拦截查询、插入

整体改造工作量太大,需要修改所有用到的表结构

方案二

  1. 添加一张路由表,将所有用户划分到不同的租户下
  2. 所有查询基于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有如下特征:

  1. 大部分SQL都是单表查询
  2. 少量关联查询 也是比较标准的关联查询
  3. 极少复杂统计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进行隔离