多租戶數據隔離
用戶擔心數據安全性,也就是要做數據隔離,不允許 A 租戶查到 B 租戶的數據
1、軟隔離
數據在一起,只不過帶著租戶 id 查詢
在底層驅動 jar 上進行封裝,強制帶上租戶 id
比如:MySQL、MQ、Redis,都是一個道理
MySQL 所有的數據操作,必須帶上租戶 id
MQ 發送消息的時候,必須帶上租戶 id
Redis 拼裝 key 的時候,必須帶上租戶 id
RPC 遠程調用的時候,把租戶 id 放到請求頭 header 中,
然后被調用模塊可以通過過濾器來從請求頭中獲取租戶 id,然后保存到 ThreadLocal 中
租戶 id 怎么自動拼裝
建議使用上下文 ThreadLocal
可以在用戶登錄之后,過濾器、攔截器解析 Token 把租戶 id 放到 ThreadLocal 中
多線程、線程池的時候,把 ThreadLocal 復制過去
2、硬隔離
直接按租戶分庫,但是這么做成本太高了
中小公司直接分庫都行,估計都沒有多少個租戶
可以考慮等租戶多了之后,再對系統進行重構升級
可以使用 MP 提供的 dynamic-datasource 動態數據源來實現
底層其實很簡單,其實就是使用 Map 來存儲 tenant 租戶 id 和 datasource 數據源的映射關系,
然后通過租戶 id 獲取到對應的數據源,然后獲取 connection 連接,來訪問租戶自己的數據
tenant 租戶 id 和 datasource 數據源的映射關系可以存儲在 MySQL 或者 Redis 數據庫中,
然后當新增租戶的時候,動態刷新 Map 來保證數據的一致性,否則 Map 中沒有新增租戶的數據源信息
總結:
小用戶一起軟隔離得了,
大用戶、vip 用戶,就硬隔離,分庫
租戶定制化
用戶要自己加字段,怎么辦?
1、核心業務數據使用 MySQL
2、動態拓展的使用 NoSQL DB,比如:Mongo DB