前言
别误会,本篇【并不是】 要用mybatis-plus自身的多租户方案:在表中加一个tenant_id字段来区分不同的租户数据。并不是的!
而是在假设业务系统已经使用mybatis-plus多数据源的前提下,如何实现业务数据库隔开的多租户系统。
这里面有点绕:多数据源可以是一个系统本身的功能需求,假设当前系统算做是个单租户,它使用了两个数据库: master1和sys1
,那么做多租户改造后,假设现在有了2个租户,那么就要添加2个数据库:master2和sys2
, 总共就是四个数据库(数据源)了…
咱们这里简单化处理,假设一个业务系统只使用一个数据库。
大纲
在本篇我们可以
- 看到mybatis-plus底层多数据源的实现原理
- 在不破坏多数据源的前提下,实现多租户功能
- spring security结合jwt记录租户信息
代码版本:
springboot: 2.7.0
dynamic-datasource-spring-boot-starter: 4.3.0
io.jsonwebtoken: 0.12.3
回顾mybatis-plus多数据源使用
1.yaml配置:
2.serviceImpl:
或者使用切面动态设置crud对应的数据源。
改造需求
- 不要把所有租户信息都直接放在yaml等配置文件中
- 可动态的添加删除数据源
- 用户登录成功后,把租户信息封装到jwt token中,后续业务访问提取中租户信息,动态切换数据源访问
方案
租户本身的信息可放在resources/tenants目录下,一个租户使用一个单独的配置文件,或者通过读取另外的数据库获取。本篇先使用前者。
修改某个租户的配置文件内容/数据库,重启服务/通过controller接口触发数据源的变更。
正篇开始
yaml配置文件中只保留一个主数据库,如上yaml截图所示。
另外的2个租户配置放classpath下tenant目录,如下所示:
新建多数据源配置类,内容如下:
@Configuration(proxyBeanMethods = false)
@Slf4j
public class MultiDataSourceConfig {
@Resource
private DruidDataSourceCreator druidDataSourceCreator;
@Resource
private DynamicRoutingDataSource dataSource;
@PostConstruct
public void init() {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
org.springframework.core.io.Resource[] resources = resolver.getResources("classpath:tenants/*.properties"