美文网首页
saas 多租户之 动态数据源基于filter实现

saas 多租户之 动态数据源基于filter实现

作者: wuyuan0127 | 来源:发表于2024-01-02 17:41 被阅读0次

1. 添加 maven

    <groupId>org.springframework.boot>  

    <artifactId>spring-boot-starter-data-jpa>   同时也支持 jpa

2. 动态添加数据源

DTO:

@Data

@NoArgsConstructor

@AllArgsConstructor

@ToString

public class DataSourceDTO {

private String username;

private String password;

private String url;

private String driverClassName;

private String poolName;

}

添加数据源controller:

@RestController

public class HelloController {

@Autowired

    private JdbcTemplatejdbcTemplate;

@Autowired

    private DefaultDataSourceCreatordataSourceCreator;

@Autowired

    private DataSourcedataSource;

@GetMapping

    public Setnow() {

DynamicRoutingDataSource ds = (DynamicRoutingDataSource)dataSource;

return ds.getDataSources().keySet();

}

@PostMapping("/add")

public Setadd(@Validated @RequestBody DataSourceDTO dto) {

DataSourceProperty dataSourceProperty =new DataSourceProperty();

BeanUtils.copyProperties(dto, dataSourceProperty);

DynamicRoutingDataSource ds = (DynamicRoutingDataSource)dataSource;

DataSource dataSource =dataSourceCreator.createDataSource(dataSourceProperty);

ds.addDataSource(dto.getPoolName(), dataSource);

return ds.getDataSources().keySet();

}

@GetMapping("/hello")

public Objecthello()throws IOException {

Expression expression = AviatorEvaluator.getInstance().compileScript("C:\\Users\\P1337892\\IdeaProjects\\springboot_demo01\\src\\main\\java\\com\\yuanwu\\ncs\\aviator\\hello\\hello.av");

expression.execute();

List> maps =jdbcTemplate.queryForList("SELECT * FROM student");

return maps;

}

}

3. application.yml 配置

mybatis:

mapper-locations: classpath:mappers/*xml

type-aliases-package: com.yuanwu.ncs.mybatis.entity

spring:

datasource:

dynamic:

primary: master

strict: false

datasource:

master:

driver-class-name: org.mariadb.jdbc.Driver

url: jdbc:mariadb://localhost:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true

username: root

password: root

4. 基于拦截器 切换数据源:

@Slf4j

@WebFilter(filterName ="dsFilter", urlPatterns = {"/*"})

public class DynamicDatasourceFilterimplements Filter {

@Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;

String requestURI = request.getRequestURI();

String headerDs = request.getHeader("ds");

log.info("经过多数据源filter,当前路径是{}", requestURI);

String dsKey = StringUtils.hasText(headerDs) ? headerDs :"master";

log.info("经过多数据源filter,dsKey={}", dsKey);

//执行

        try {

DynamicDataSourceContextHolder.push(dsKey);

filterChain.doFilter(servletRequest, servletResponse);

}finally {

DynamicDataSourceContextHolder.poll();

}

}

}

5. 添加数据源 json

{

  "username": "root",

  "password": "root",

  "url": "jdbc:mariadb://localhost:3306/test_order?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true",

  "driverClassName": "org.mariadb.jdbc.Driver",

  "poolName": "test_order"

}

6.  saas 多租户就可以 基于 注册动态添加数据库  动态添加数据源

然后租户id 给 用户, 然后登陆的时候 在header 中 或者 cookie中 添加 租户Id  实现数据源切换。。。

相关文章

网友评论

      本文标题:saas 多租户之 动态数据源基于filter实现

      本文链接:https://www.haomeiwen.com/subject/rdapndtx.html