多租户
简介
多租户(Multi-tenancy)允许多个租户共享同一套应用与库表,通过数据行级隔离(如 tenant_id)区分数据。MMS 借助 MyBatis-Plus 租户插件 在 SQL 层自动附加租户条件,适合 SaaS 与可关闭租户的单租户部署。
核心特点
- 资源共享:统一部署、统一升级。
- 隔离性:业务表带
tenant_id时由插件自动拼条件;平台级表通过 排除列表 或sys_gen_前缀表 不参与租户条件。 - 可扩展性:租户表、套餐等由
mms-system维护;需分库时可结合多数据源另行设计。 - 可定制:租户维度配置、套餐能力等可在业务层扩展。
MMS 配置
1. 开启或关闭
yaml
--- # 多租户
tenant:
enable: true # false 则完全不注册租户行插件
column: tenant_id
exclusionTable:
- sys_user_role
- sys_user
- sys_tenant_package
- sys_tenant
- sys_role_function
- sys_role
- sys_dept
- sys_oss_config
- sys_oss
- sys_function
- sys_dict_data
- sys_dict
- sys_config
- sys_sign
- sys_gen_table说明:
enable为空 时按 关闭 处理(不注册拦截器)。exclusionTable在启动时会被 小写、去重 后写入只读集合,运行时按表名 忽略租户条件(等价于原逻辑中的equalsIgnoreCase)。- 表名以
sys_gen_开头 的表一律忽略租户条件(代码生成临时表约定),无需全部写进 YAML。
与当前主仓 mms-admin 默认列表不一致时,以你本地 application.yml 为准;上表为文档与代码同步时的参考清单。
2. 单条 SQL / Mapper 忽略租户
java
@InterceptorIgnore(tenantLine = "true")
@Select("SELECT * FROM sys_user")
List<User> selectAllUsers();3. 租户 ID 从哪里来
- 管理端登录后,租户 ID 来自
LoginObject.getLoginTenant():根据当前登录用户 ID 读 Redis(ADMIN_TENANT_KEY);未登录或缓存未命中时回落为000000,避免空租户写入非法 SQL。 - MyBatis 租户表达式:
StringValue(租户字符串),与上类行为一致。
4. 实体填充
继承 BaseEntity 的插入填充在已登录时会写入 tenantId,逻辑见 MybatisPlusMetaObjectHandler(与 StpUtil.isLogin() 联动)。
实现位置(源码)
| 内容 | 位置 |
|---|---|
| 配置属性 | mms-common → TenantProperties(tenant.*) |
| 租户行插件 | mms-datasource → MybatisPlusConfig |
| 登录与租户读取 | mms-authority → LoginObject |
配置片段与排除表逻辑以 MybatisPlusConfig 与 application.yml 为准;文档中的历史示例若出现 TenantContext 等类名,均已废弃,以 LoginObject 为准。
开发环境与 SQL 日志
- 默认
application.yml使用Slf4jImpl输出 MyBatis 日志;需要看 SQL 时可提高logging.level(如 mapper 包 DEBUG),无需改用StdOutImpl。 - 生产 环境见
application-prod.yml:NoLoggingImpl关闭详细 SQL 日志。
