# 模式介绍 本项目可以通过修改配置文件的中一个参数,轻松切换项目的 **租户模式**。 ``` lamp: database: multiTenantType: SCHEMA # 可选值: NONE COLUMN SCHEMA SCHEMA_COLUMN DATASOURCE(会员版专属) DATASOURCE_COLUMN(会员版专属) ``` ## 本项目支持以下几种模式: | 租户模式 | 描述 | 优点 | 缺点 | |---|---|---|---| | NONE(非租户模式) | 非租户模式,就是普通项目 | 简单、适合独立系统 | 缺少租户系统的优点 | | COLUMN(字段模式) | 租户共用一个数据库,在业务表中增加字段来区分 | 简单、不复杂、开发无感知 | 数据隔离性差、安全性差、数据备份和恢复困难、 | | SCHEMA(独立schema) | 每个租户独立一个 数据库(schema),执行sql时,动态在表名前增加schema | 简单、开发无感知、数据隔离性好 | 配置文件中必须配置数据库的root账号、不支持复杂sql和 sql嵌套自定义函数 | | DATASOURCE(独立数据源) | 每个租户独立一个 数据库(数据源),执行代码时,动态切换数据源 | 可独立部署数据库,数据隔离性好、扩展性高、故障影响小 | 相对复杂、开发需要注意切换数据源时的事务问题、需要较多的数据库 | | DATASOURCE_COLUMN(独立数据源+字段模式) | 每个租户独立一个 数据库(数据源),执行代码时,动态切换数据源,在动态拼接 子租户id 二次隔离 | 可独立部署数据库,数据隔离性好、扩展性高、故障影响小、支持大租户小门店形式 | 相对复杂、开发需要注意切换数据源时的事务问题、需要较多的数据库 | ## 每种模式的数据库和字段情况 | 模式 | 表中有无租户字段 | 实体类中有无租户字段 | 分布式事务| 有几个数据库 | |---|---|---|---|---| | NONE | 无 | 无 | 支持 | lamp_none、lamp_activiti | | COLUMN | 有 | 无 | 支持 | lamp_column、lamp_activiti | | SCHEMA | 无 | 无 | 支持 | lamp_defaults、lamp_base_{tenant}、lamp_extend_{tenant} | | DATASOURCE | 无 | 无 | 支持 | lamp_defaults、lamp_base_{tenant}、lamp_extend_{tenant} | | SCHEMA_COLUMN | 有 | 无 | 支持 | lamp_defaults、lamp_base_{tenant}、lamp_extend_{tenant} | | DATASOURCE_COLUMN | 有 | 无 | 支持 | lamp_defaults、lamp_base_{tenant}、lamp_extend_{tenant} | # SCHEMA、DATASOURCE、SCHEMA_COLUMN、DATASOURCE_COLUMN 模式各个服务需要准备的数据库 | 后台服务 | 服务名 | 启动时连接的库 | 运行时租户库 | 功能描述 | |---|---|---|---|---| | 认证服务 | oauth | lamp_defaults | lamp_base_{tenant} | 负责登录、用户必备的数据接口 | | 工作流服务 | activiti | lamp_activiti | lamp_activiti | 会员版专属功能 | | 基础服务 | authority | lamp_defaults | lamp_base_{tenant} | 资源、系统配置、组织架构等基础功能 | | 文件服务 | file | lamp_defaults | lamp_base_{tenant} | 负责文件上传、下载等功能 | | 消息服务 | msg | lamp_defaults | lamp_base_{tenant} | 负责站内信、消息、短信、邮件等功能 | | 租户服务 | tenant | lamp_defaults | lamp_defaults | 负责租户模式管理租户 | | 网关服务 | gate | lamp_defaults | lamp_extend_{tenant} | 负责统一路由、认证、限流等 | ## 题外话: 问: `01-docs/sql/*.sql` 和 `lamp-tenant/lamp-tenant-server/src/main/resources/sqls/*.sql` 有什么区别? 答: `01-docs/sql/*.sql` 存放的是系统内置的数据库脚本,脚本里面除了`表结构`和一些`必要数据`,主要用于启动项目, 作者会实时的将自己环境的脚本和数据导出到这里。 `lamp-tenant/lamp-tenant-server/sqls/*.sql` 里面的脚本用于项目启动后,配置 `SCHEMA` 模式,新建租户时使用。 - `lamp_base.sql` 存放的是新租户基础库的`表结构` - `lamp_base_data.sql` 存放的是新租户基础库的`必要数据` - `lamp_extend.sql` 存放的是新租户扩展库的`表结构` - `lamp_extend_data.sql` 存放的是新租户扩展库的`必要数据` - 脚本里面的`SELECT 1`用于防止代码执行空脚本时报错,就随便放入一条无关紧要的sql (可以改成其他无关紧要的sql) 开源版本请忽略下面的这条: `lamp-authority-server`、`lamp-gateway-server`、`lamp-msgs-server` 等任意一个服务`src/main/resources/sqls/*.sql` 下的脚本文件用于`DATASOURCE`模式,新建租户时使用。 SCEHMA模式是在tenant服务一次性将整个服务脚本初始化,DATASOURCE模式是每个服务、每个租户独立数据源,所以得分散在各自的服务初始化自己服务的脚本和数据! # 分库原则: SCHEMA模式和DATASOURCE模式不建议每个服务一个库,假设权限、文件、消息、认证、网关服务每个服务独立数据库(共5个), 那么新增一个租户时,租户库会成倍的增加, 会占用N * 5个库(还有一个默认库)。 COLUMN和NONE模式则不用考虑上述问题。 鉴于此,合理的合库至关重要,在本系统中,权限、消息、文件、认证服务等都可以理解成基础功能,而网关、订单、demo服务等属于扩展功能, 使用本框架二次开发某种类型的项目时(如商城、ERP、CMS等)可以理解成业务功能, 所以推荐分库规则为: 1. 租户服务、定时任务 共用默认库,命名规则为 lamp_defaults 2. 权限、消息、文件、认证服务 共用基础库,命名规则为 lamp_base_{TENANT} 3. 网关、订单、demo服务 共用扩展库,命名规则为 lamp_extend_{TENANT} **4. 二次开发时可以新建一个业务库,命名规则为 lamp_biz_{TENANT} (本项目不涉及该库)**