惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
量子位
V
V2EX
S
SegmentFault 最新的问题
月光博客
月光博客
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
博客园_首页
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
Y
Y Combinator Blog
The Cloudflare Blog
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
B
Blog
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed

博客园 - 程序员老刘

windows11的vmware启动报错 MySQL8的root帐号授权 centrifugal 的IM消息服务历史消息报错 支持restart的启动脚本 golang strings.Split的疑问 golang的极简流式编程实现 golang 常用的日期方法和时区的坑 golang SQLite3性能测试 golang的多协程实践 golang redis的模式订阅 golang 实现并发计算文件数量 java开发的zimg客户端 CAS单点登录实践(spring cas client配置) 81进制,用多进制方式把一个长长的整数变短 chrome浏览器自动填充失效问题 spring 登录提示 Bad credentials spring 项目tomcat 8.0.2 发布报错:Could not initialize class org.hibernate.validator.engine.ConfigurationImpl spring tiles界面为空白 activiti部署到linux后流程图不显示汉字的问题
SaaS多租户改造Spring项目核心代码
程序员老刘 · 2023-04-04 · via 博客园 - 程序员老刘

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、定时任务的多租户改造-不是简单的套个循环把所有的租户数据库循环一下。考虑到租户很多的情况,有些定时任务就不适合了,需要改造为事件触发的消息机制。