Skip to content

多租户

简介

多租户(Multi-tenancy)允许多个租户共享同一套应用与库表,通过数据行级隔离(如 tenant_id)区分数据。MMS 借助 MyBatis-Plus 租户插件 在 SQL 层自动附加租户条件,适合 SaaS 与可关闭租户的单租户部署。

核心特点

  1. 资源共享:统一部署、统一升级。
  2. 隔离性:业务表带 tenant_id 时由插件自动拼条件;平台级表通过 排除列表sys_gen_ 前缀表 不参与租户条件。
  3. 可扩展性:租户表、套餐等由 mms-system 维护;需分库时可结合多数据源另行设计。
  4. 可定制:租户维度配置、套餐能力等可在业务层扩展。

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-commonTenantPropertiestenant.*
租户行插件mms-datasourceMybatisPlusConfig
登录与租户读取mms-authorityLoginObject

配置片段与排除表逻辑以 MybatisPlusConfigapplication.yml 为准;文档中的历史示例若出现 TenantContext 等类名,均已废弃,以 LoginObject 为准。

开发环境与 SQL 日志

  • 默认 application.yml 使用 Slf4jImpl 输出 MyBatis 日志;需要看 SQL 时可提高 logging.level(如 mapper 包 DEBUG),无需改用 StdOutImpl
  • 生产 环境见 application-prod.ymlNoLoggingImpl 关闭详细 SQL 日志。

相关文档

Released under the MIT License.