SaaS多租户改造Spring项目核心代码

 

Spring项目在进行SaaS多租户改造时的核心功能是根据不同租户切换不同的database数据库,这些database也可能在一个数据源,也可能在多个数据源中,这些信息需要有个地方配置,一般这些配置在中心数据库,中心数据库需要包含用户名和其使用的数据源和数据库对应关系,一般情况下防止用户名重复,要求用户名是邮箱或者手机号码这样具有唯一性的。

1、动态切换数据源的代码:

import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;

DynamicDataSourceContextHolder.push("db1");

2、动态切换数据库,首先切换到相应的数据源,然后执行use命令切换数据源:

public interface DBChangeMapper {
        @Select("use ${dbName}")
        void changeDB(@Param("dbName") String abc);
    }

3、拦截请求:

 @Aspect
  @Component
  public class DataSourceAOP {
      @Autowired
      DBChangeMapper dbChangeMapper;
      @Before("execution(* com.rayooai.system.controller.SysRoleController.*(..))")
      public void executeUseDB() {
          LoginUser lu = SecurityUtils.getLoginUser();
          System.err.println("拦截请求,userId:" + lu.getUserid());
          //切换数据源
          //切换数据库
      }
  }

这段代码是在若依系统上拦截用户角色部分的代码,在若依的系统里可以通过

SecurityUtils.getLoginUser();
获取包含用户名在内的用户信息。
获取到用户名后查询中心库的配置,获取数据源和数据库,通过1、2的代码切换到对应的数据源和数据库,然后在执行相应的数据库代码。
4、最后:
SaaS多租户改造不是个简单的事情,这里只是冰山一小角。至少要包括:
a、注册中心-租户创建(包含建库脚本,初始化数据),租户状态管理、租户计费、配置查询;
b、各个模块的请求拦截改造;
c、定时任务的多租户改造-不是简单的套个循环把所有的租户数据库循环一下。考虑到租户很多的情况,有些定时任务就不适合了,需要改造为事件触发的消息机制。
posted @ 2023-04-04 15:07  程序员老刘  阅读(239)  评论(0编辑  收藏  举报