多租户数据隔离
用户担心数据安全性,也就是要做数据隔离,不允许 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