0%

MEPER-Cloud-MultiDB

MEPER-Cloud 多租户新方案,针对公司进行分数据库,也就是之前的工作空间设计依然沿用,但是针对不同的公司直接进行数据库级别隔离。

设计方案

1、企业认证成功

2、Portal 调用调用服务创建新数据库

3、Portal 调用 MEPER-Cloud 注册公司对应数据源

4、MEPER RequestInfo filter 中修改对应的 DataSource 中获取 hibernate template

5、Portal 调用 MEPER 创建公司和 SI 账号(白名单接口,数据源根据新增的拦截器进行切换,写入对应的数据库中,设计中有一个默认的主库,写用户信息的时候对应数据库,主库,还有portal 的数据库都要创建)

6、Portal 创建空间,调用 MEPER 进行数据初始化工作(根据 Header 中的 CompanyId 切换 hibernate template,调用登录接口获取 token,后续的操作验证 header 和对应的 token)

按照以上的设计方案可以实现沿用现在的多空间设计的基础上,进行公司级别的数据库隔离方案。

业务描述

企业认证过程

upload successful

需求分析

按照设计方案来处理的话,可能会有的需求如下。

创建数据库

企业认证成功后进行数据库的创建,返回数据库的链接地址和账号密码。

应该需要一个表来记录对应的关系,并且开放接口给 MEPER 在服务重启或者刷新时候进行 CompanyId 和 hibernate template 的绑定。

初始化表结构

一个空的数据库创建完成后,不能再使用当前的 MEPER 进行数据初始化操作,而是需要重新进行建表逻辑。

目前的方案是,整理对于liquiBase 的建表脚本,还有必要数据的写入脚本,通过执行脚本的方式进行表结构的初始化操作。
当前的方案还需要找到能运行 liquibase 脚本的解决办法。

参考:

动态数据源进行 liquibase 初始化

Java 调用 liquibase

liquibase基本用法

绑定数据库到 MEPER

MEPER 一个 server 对应多数据源,所以需要方案确认当前请求需要使用哪一个数据源,所以涉及到的需求如下。

1、Map<CompanyId,HibernateTemplate>

已经解决。

需要在 MEPER 中有一个 Map,可以根据 companyId 获取对应的数据。

2、Map Filter

需要改造一下 requestInfofilter,把 Datasource 修改掉

一个拦截器,需要在请求中获取到 CompanyId 然后作为依据进行 HibernateTemplate 的切换。

3、Transaction Manager

已经解决了

对应的HibernateTemplate需要对应的Transaction Manager,支持数据的写入。

4、Api 支持注册数据源到 Map

数据源是动态增加的,在不重启服务的情况下,把 companyId 和HibernateTemplate 注册到 Map 中去。

5、RemoteApi注册 Map

已经解决

重启服务的情况下,通过接口获取到所有的companyId 和HibernateTemplate 注册到 Map 。

6、区分用户在 Vaadin 配置数据源

需要验证一下,查询不到主库的数据源信息

创建空间进行数据初始化

按照 liquibase 进行表结构初始化的操作的话,对应就不会有默认加载的 admin 这部分数据。

1、CompanyId 和对应 token 的验证

保证当前请求头中的 companyId 和 对应 token 传入的信息一直,保证数据隔离安全性。

2、是否需要 admin 这部分数据

该 admin 账号数据可以跨空间看到对应当前空间下所有的数据。

3、确认在没有 admin 这部分数据的情况下

空的数据库,在服务运行时的 Router 初始化是否会有影响,由于当前 MEPER 服务是一个 service 对应多个 database,所以菜单的 Menufactory ,对应 RouterLoader 是否需要修改优化。