# 模式介紹
本項目可以通過修改配置文件的中一個參數,輕松切換項目的 **租戶模式**。
```
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部署