# 多租户指南
# 一.相关概念
# 1. 平台
平台是支持多租户架构的系统基础,提供租户管理、数据隔离、权限控制等核心功能。
# 2. 租户
租户是使用平台服务的独立组织单位。
- 租户类型
根据租户类型的不同,可以分为主租户和子租户两种类型
- 主租户:特指平台的系统租户sys_tenant,是整个平台的核心。
- 子租户:除sys_tenant之外的其他租户,是平台的服务对象。
- 租户模式
根据租户模式的不同,可以分为独立法人和多级法人两种模式,需要注意的是,两种模式不能兼容共存,只允许存在一种租户模式
- 独立法人:子租户可以独立维护机构、账号、用户等信息,且账号全局唯一。
- 多级法人:子租户的机构、账号等信息从主租户同步,子租户无维护权限,账号可跨多租户。
# 3. 多租户登录
在多租户系统中,账号可以绑定多个租户,在用账号第一次进行登录时,可支持选择租户进行登录,登录完成之后,支持租户切换功能。并支持登录记忆功能,下次该账号进行登录时会自动选择上次登录的租户。
# 4. 数据隔离和应用类型
- 数据隔离
在数据隔离方面,我们提供了物理隔离和逻辑隔离两种方式,以满足不同租户对安全性和成本的要求
- 物理隔离:独立数据源,物理完全隔离,安全性最高。
- 逻辑隔离:共享数据源,租户ID隔离,成本低利用率高。
- 应用类型
在应用层面,我们也从部署和数据两个维度进行了划分,从而实现了应用的灵活管理和数据的精细化控制。 从部署层面,应用可分为逻辑应用和物理应用。
- 逻辑应用:逻辑应用是和当前进程应用共享同一进程的应用,在工作台直接创建即可。
- 物理应用:物理应用是独立部署进程的应用,需在应用中心注册。
从数据层面,应用可分为独立应用和共享应用。
- 独立应用:子租户创建的专属应用,数据只属于当前租户,和其他租户以及主租户不共享。
- 共享应用:租户之间数据共享的应用。
从数据层面来说,逻辑应用可以是一个独立应用,也可以是一个共享应用,物理应用同样,可以是一个独立应用,也可以是一个共享应用,而且都支持配置独立数据源,也可以和租户共享数据源。
# 5. 数据源
在多租户系统中,租户、应用都可单独配置数据源,数据源生效规则如下:
- 如果应用配置了数据源,则默认优先使用应用数据源
- 如果应用没有配置数据源,则默认优先使用应用所属的租户数据源
- 如果租户没有配置数据源(独立数据源),则默认使用主租户的default数据源
# 二.租户管理
# 1. 创建动态数据源
子租户和主租户之间可以共用数据源,也可以独立使用数据源,因此平台提供动态创建数据源能力,以便在创建子租户时可随时绑定数据源,创建步骤如下:
# 1.1 sysadmin管理员账号登录
使用管理员账号登录之后,点击后台管理-数据源管理

# 1.2 在线新增数据源
添加完数据源,并测试完成之后,点击保存即可 警告:动态创建、修改、删除数据源之后,应当立即重启AFCENTER

# 2. 租户创建与管理
# 2.1 配置系统变量
目前租户模式有:多级法人、独立法人两种租户模式,在系统变量里可配置当前租户模式,具体配置如下:
| 系统变量名称 | 系统变量值 | 说明 |
|---|---|---|
| eos.tenant-arch-type | multilevel | 多级法人模式 |
| eos.tenant-arch-type | ind | 独立法人模式 |
注意:只允许存在一种租户模式,并且修改完租户模式系统变量,需要重新启动AFCENTER才生效。
配置完租户模式之后,用sysadmin系统管理员登录系统,然后进行租户创建
# 2.2 创建独立法人租户
独立法人模式下创建租户,公司名称、管理员需要自己填写,并且管理员账号会随着独立法人租户一起创建;数据源根据业务需求自定义绑定数据源。

# 2.3 创建多级法人租户
多级法人模式下创建租户,机构、管理员需从主租户里面选择,数据源根据业务需求自定义绑定数据源。

# 2.4 同步组织数据
租户数据我们分为两大类:组织数据、业务数据。组织数据同步规则如下:
| 组织数据 | 多级法人 | 独立法人 | 筛选条件 |
|---|---|---|---|
| 维度 | 同步 | 同步 | isDataSync != 0 |
| 组织机构 | 同步 | 不同步 | isDataSync != 0 |
| 账号 | 同步 | 不同步 | isDataSync != 0 |
| 员工 | 同步 | 不同步 | isDataSync != 0 |
| 岗位 | 同步 | 不同步 | isDataSync != 0 |
| 工作组 | 同步 | 不同步 | isDataSync != 0 |
| 员工岗位关联关系 | 同步 | 不同步 | isDataSync != 0 |
| 员工工作组关联关系 | 同步 | 不同步 | isDataSync != 0 |
在创建子租户的时候,根据上述同步规则筛选出组织数据从主租户里面复制同步到子租户数据源里。同时,还提供了在线数据同步功能,方便主租户新增了数据之后,子租户实时同步主租户数据,操作如下:

# 2.5 同步业务数据
租户数据我们分为两大类:组织数据、业务数据。业务数据同步规则如下:
| 业务数据 | 多级法人 | 独立法人 | 筛选条件 |
|---|---|---|---|
| 应用 | 同步 | 同步 | isMultiTenantShare != 0 |
| 业务对象 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| 资源、分组 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| 菜单 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| 角色、关联关系 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| 系统变量 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| 业务字典 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| widget/门户/首选项 | 同步 | 同步 | isMultiTenantShare != 0 && isDataSync != 0 |
| 流程数据 | 同步 | 同步 |
在创建子租户的时候,根据上述同步规则筛选出应用数据从主租户里面复制同步到子租户数据源里。同时,还提供了在线数据同步功能,方便主租户新增了数据之后,子租户实时同步主租户数据,操作如下:

# 2.6 查看同步记录
系统会记录每一次的同步操作,方便管理员查看同步记录,

# 2.7 应用绑定数据源
系统支持在线管理子租户内所有的逻辑应用的数据源,可在线给逻辑应用绑定特定的数据源

# 三.场景用例
# 1. 逻辑隔离场景
该场景适合物理资源紧张,但是又有租户数据隔离的需求,这个时候子租户可以和主租户共用同一个数据源用tenantId做逻辑隔离。
# 1.1 创建子租户
创建子租户时,数据源选择和主租户相同数据源,然后机构和租户管理员根据业务需求自主选择对应机构即可。

创建完子租户之后,我们用刚刚创建子租户选择的管理员进行登录。
# 1.2 创建应用
在没有对应用单独配置数据源时,默认创建的应用是使用所属租户的数据源,因此,我们直接在工作台创建应用即可


# 1.3 业务开发
创建完应用之后,我们就可以进行业务开发了,我们模拟一下简单的场景:创建实体、表、表单、保存数据,验证一下数据是否在共享数据源内做了租户隔离
# 1.3.1 创建实体,生成表

# 1.3.2 创建表单,保存数据

# 1.3.3 验证数据是否租户隔离
可以看到,在数据库表内,tenantId已经保存为当前租户id了,数据隔离已经完成。

# 2. 租户物理隔离场景
该场景是子租户自定义选择一个数据源,和主租户不共用数据源,实现数据层面的物理隔离。
# 2.1 数据源初始化sql说明
因为需要独立数据源,因此该租户绑定的数据源需要初始化对应的sql,具体初始化sql脚本如下: 初始化发版介质中sql-script-8.5.0.zip包中afcenter目录下的脚本,选择对应数据库的脚本初始化即可
# 2.2 创建子租户
创建子租户时,选择和主租户不同的数据源,然后机构和租户管理员根据业务需求自主选择对应机构即可。

# 2.3 创建应用
参考上述创建应用即可
# 2.4 业务开发
创建完应用之后,我们就可以进行业务开发了,我们模拟一下简单的场景:创建实体、表、表单、保存数据,验证一下数据是否保存进当前应用所属租户绑定的数据源了。
# 2.4.1 创建实体,生成表
参见创建实体,生成表
# 2.4.2 创建表单,保存数据

# 2.4.3 验证数据是否租户隔离
可以看到,在alone数据源对应的业务表内,业务数据已经保存进去了,数据隔离已经完成。

# 3. 逻辑应用数据物理隔离场景
该场景是应用单独配置数据源,不和租户共用一个数据源,实现每个应用可逻辑、可物理的数据隔离需求。
# 3.1 应用配置数据源并初始化sql
因为需要独立数据源,因此该租户绑定的数据源需要初始化对应的sql,具体初始化sql脚本如下: 选择发版介质中sql-script-8.5.0.zip包中microapp目录下的脚本,选择对应数据库的脚本初始化即可
用sysadmin系统管理员账号登录,后台管理-租户管理,然后针对具体租户下应用进行数据源绑定

# 3.2 业务开发
参考上述业务开发步骤,最终验证查看业务数据是否保存进当前应用绑定的数据源内。
# 4. 物理应用数据物理隔离场景
该场景是应用单独配置数据源,不和租户共用一个数据源,实现每个应用可逻辑、可物理的数据隔离需求。
# 4.1 数据源初始化sql说明
因为需要独立数据源,因此该租户绑定的数据源需要初始化对应的sql,具体初始化sql脚本如下: 初始化发版介质中sql-script-8.5.0.zip包中microapp目录下的脚本,选择对应数据库的脚本初始化即可
# 4.2 业务开发
参考上述业务开发步骤,最终验证查看业务数据是否保存进当前应用绑定的数据源内。