java实现多租户_spring boot 项目中多租户的实现

项目背景

项目中SaaS服务需要提供多租户基础功能,通过访问域名区分不同的客户,进而隔离数据源,即一个租户一个数据库。

AbstractRoutingDataSource

spring中对切换数据源提供了动态设置方法,通过determineCurrentLookupKey()设置值切换对应数据源。

org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 源码的介绍:

基于AbstractRoutingDataSource的多数据源动态切换,可以实现读写分离,但是注意无法动态的增加数据源,只能在项目启动时加载。

实现逻辑

定义DynamicDataSource类继承抽象类AbstractRoutingDataSource,并实现了determineCurrentLookupKey()方法。

启动时加载多个数据源,并配置到AbstractRoutingDataSource的defaultTargetDataSource和targetDataSources中。

对所有controller方法做aop,根据当前域名或者前端设置值修改本地线程动态数据源名称。

新建类 DynamicDataSource

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**

* 动态获取DataSource

*

* @author plsy

*/

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DynamicDataSourceContextHolder.getDataSource();

}

}

通过基于本地线程的上下文管理来切换数据源

import org.apache.log4j.Logger;

import java.util.LinkedList;

/**

* 动态数据源上下文管理

*

* @author plsy

*/

public class DynamicDataSourceContextHolder {

static Logger logger = Logger.getLogger(DynamicDataSourceContextHolder.class);

/**

* 存放当前线程使用的数据源类型信息

*/

private static final ThreadLocal contextHolder = new ThreadLocal();

/**

* 数据源使用顺序标识

*/

public static LinkedList dataSourceIds =

你可能感兴趣的:(java实现多租户)