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

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
有赞技术团队
有赞技术团队
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
月光博客
月光博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog

博客园 - 程序员老刘

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