定義
多租戶其本質是一種數(shù)據隔離的架構,通俗講,既同一套系統(tǒng),不同群體的用戶進來之后,只能看到當前群體用戶所授權的用戶數(shù)據,而看不到其他群體用戶的數(shù)據。舉個例子,比如有一套課程培訓系統(tǒng)開發(fā)給多家公司使用,A公司的員工進入系統(tǒng)只能看到A公司的相關課程,B公司員工進入系統(tǒng),則只能看到B公司相關課程,而A公司的員工看不到B公司的課程,B公司看不到A公司的課程,這就是多租戶。
多租戶的方案
目前多租戶的實現(xiàn)方案大概有這幾種:
- 多租戶之間新建獨立數(shù)據庫,自己使用自己的庫,特點是隔離性最好,但成本巨大
- 多租戶之間使用同一套數(shù)據庫,使用不同的名稱空間,特點是需要維護多多套名稱空間的表,對數(shù)據庫的性能要求較高
- 多租戶之間使用同一套數(shù)據庫,使用相同的名稱空間,在各個表里設置租戶字段,用來標識租戶身份。特點是成本低,開發(fā)復雜度較高。
多租戶搭建
這里我們采用第三種方式搭建。
數(shù)據庫表準備
需要準備兩個表,test表是不需要租戶設置的,test_tenant是需要租戶設置的,表結構如下:

image.png

image.png
自定義上下文
主要是用來從上下文設置和獲取租戶id的

image.png
多租戶handler
主要是從自定義上下文中獲取租戶id,并且攔截執(zhí)行的sql,加上租戶id的添加參數(shù)

image.png

image.png
mybatis-plus打開多租戶配置
主要是打開mybatis-plus打開多租戶配置,注入自己的多租戶handler

image.png
租戶切面
主要是定義切面攔截,當客戶端向服務端發(fā)起請求的時候,攔截請求,從請求頭里獲取租戶id,添加到自定義上下文中

image.png
配置文件
這里主要是設置了一個配置參數(shù),對不要設置租戶id的表,可以在這里配置

image.png
測試
新增test表數(shù)據(該表不需要設置租戶id)

image.png

image.png
新增test_tenant表數(shù)據(該表需要設置租戶id)

image.png

image.png

image.png
結束
需要源碼的可以關注公眾號【溫故知新之java】,更多干活與你分享。