# 模式介绍
本项目可以通过修改配置文件的中一个参数,轻松切换项目的 **租户模式**。
```
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} (本项目不涉及该库)**
- 简介
- 会员版
- 3.x和4.x的区别
- 新手必读
- 如何高效提问
- 项目地址
- 项目截图
- 架构介绍
- 开发规范
- 租户模式介绍
- lamp-web和lamp-web-plus的区别
- lamp-cloud和lamp-boot区别
- 免费视频&软件下载
- 文档反馈
- lamp-cloud
- 服务介绍
- 环境要求
- 工程导入
- nacos启动(单机版)
- nacos启动(集群版)
- 将配置文件导入Nacos
- seata启动(单机版)
- DATASOURCE模式启动(会员版)
- SCHEMA模式启动
- COLUMN模式
- NONE模式
- lamp-web启动
- lamp-web生产部署
- lamp-web-plus启动(会员版)
- lamp-web-plus生产部署
- lamp-boot
- 环境要求
- 工程导入
- DATASOURCE模式启动(会员版)
- SCHEMA模式启动
- COLUMN模式启动
- NONE模式启动
- lamp-web启动
- lamp-web生产部署
- lamp-web-plus启动(会员版)
- lamp-web-plus生产部署
- 功能介绍
- 租户设置
- 数据源配置(会员版)
- 租户管理
- 超级用户
- 工作台
- 通知公告
- 组织管理
- 机构管理
- 岗位管理
- 用户管理
- 资源中心
- 消息中心
- 短息模版
- 短信中心
- 附件管理
- 流程管理
- 流程部署
- 模型管理
- 系统设置
- 菜单管理
- 角色管理
- 字典管理
- 地区管理
- 参数管理
- 操作日志
- 登录日志
- 在线用户
- 应用管理
- 网关管理
- 限流规则
- 组织访问
- 开发者管理
- 定时任务
- 接口文档
- Nacos
- 服务监控
- 数据库监控
- 缓存监控
- zipkin监控
- SkyWalking监控
- 常用配置
- 如何保证我的代码能更新到最新代码
- 序列化和反序列化
- 修改日志级别
- 文件上传&下载&预览
- 修改租户模式
- 分页
- 导入导出
- 请求放行(忽略token&忽略URI权限&忽略租户编码)
- 异常处理
- 全局返回
- 参数校验(会员版)
- 系统日志
- 自研权限认证(URI、按钮、菜单)
- 数据权限(旧)
- 数据库配置
- Mybatis配置
- 更多数据库/数据源/Mybaits配置
- Redis(缓存)配置
- RabbitMq配置
- 灰度发布
- 上手开发
- 表结构整理
- 项目结构&依赖&调用流程介绍
- 生成一个新服务
- 生成后端代码
- 生成前端lamp-web代码
- 生成前端项目lamp-web-plus代码
- 跨域处理
- Swagger文档调试技巧
- FeignClient接口调用
- 多租户实现原理
- 分布式事务
- Zipkin配置(过时)
- SkyWalking配置
- 代码生成器和自动回显组件使用介绍
- lamp-util原理解析
- 全局注解(lamp-annotation)
- 核心包(lamp-core)
- 自动回显(lamp-echo-starter)
- 权限控制(lamp-security-starter)
- 当前登录用户信息(lamp-jwt-starter)
- 缓存(lamp-cache-starter)
- SpringBoot全局配置(lamp-boot-util)
- SpringCloud全局配置(lamp-cloud-starter)
- 数据源&持久层配置(lamp-databases)
- 对象属性复制(lamp-dozer-starter)
- 操作日志(lamp-log-starter)
- 消息队列(lamp-mq-starter)
- 在线文档(lamp-swagger2-starter)
- 前后端表单统一验证(lamp-validator-starter)
- 防止Xss攻击(lamp-xss-starter)
- 生产部署
- 部署前言
- jar部署