多租户下的应用
多租户下最容易搞混的是:哪些东西按租户、哪些东西一个部署里只有一份。 这一页把两者分开列清楚,并说明"别人还在用就不动全局的东西"那道闸。
三类数据,租户归属各不相同
| 类别 | 表 | 租户归属 |
|---|---|---|
| 目录 | app_info、app_version、app_category、app_plan | 平台级,不按租户隔离(这几张表本来就在租户排除清单里) |
| 安装实例 | app_install、app_install_task、app_version_menu | 每个部署各一份,但 app_install 带 tenant_id → 按租户安装 |
| 迁移记录 | app_schema_history | 每个部署各一份,去重判据不带租户(表结构在所有租户间共享) |
应用按租户安装与授权
- 装一个应用只影响本租户:
app_install多一条记录、本租户的角色多一批菜单授权。 别的租户登录看不到那些菜单; - 别的租户要用,得自己装一次(或者由平台方按套餐开通)。工作台「三方应用」那组的副标题 写的就是「本租户已开通」;
- 目录里同一个应用只有一个条目 —— 租户 A 和租户 B 装的是同一个
app_info/app_version, 只是各有一份安装记录。
菜单行不分租户,分的是"可见性"与"授权"
sys_menu 里的菜单行是全局行:清单 upsert 出来的就是那一棵,所有租户共用。
按租户区分的是另外两样:
| 分租户的东西 | 存在哪 | 怎么起作用 |
|---|---|---|
| 授权 | sys_role_menu | 挂在本租户的角色上。装的时候只授一个角色,其余手工加,见 装完以后:菜单与权限 |
| 可见性 | 菜单过滤器的隐藏清单,按租户缓存在 AppMenuCache | 本租户停用或卸载过的应用,它的菜单不再出现在该租户的菜单树里 |
所以同一行菜单行,在 A 租户的菜单树里出现、在 B 租户里不出现,是正常现象,不是数据错乱。
一个部署内全局共享的东西
下面这些不按租户分,一个部署里只有一份:
| 全局的东西 | 位置 |
|---|---|
| 菜单行(含按钮等后代) | sys_menu |
| 应用自己的业务表 | 数据库里那张表本身(租户隔离落在业务表的 tenant_id 与框架的租户插件上,不是"每租户一套表") |
| 迁移执行记录 | app_schema_history |
| 本机产物 | 后端 jar(插件落位目录)、前端产物目录、active-plugins.txt |
| 应用自带的字典与站点配置 | 字典表与参数表里以应用编码为前缀的那些行 |
| 跑着的插件后端 | 宿主进程里的插件运行时(每个应用一份子上下文 + 类加载器) |
那道闸:别人还在用就不动全局的东西
「彻底删除」时,如果还有别的租户装着同一个应用,就会跳过所有全局清理 —— 菜单 / 数据表 / 迁移记录 / 本机产物 / 字典与站点配置一律不删,只在任务日志里逐条说清 "检测到还有 N 个租户装着该应用:菜单与数据表是全局共享的,已跳过删除"。
判据是 app_install 里状态非 uninstalled 的其它记录 —— 会排除自己那条
(此时自己这条的状态还没改成 uninstalled,不排除的话判据永远成立、功能直接失效)。
这么做是因为反过来等于替别的租户做了一个不可恢复的决定。
第二道闸是平台表前缀保护:只删迁移脚本里声明过的表,表名命中 sys_ / app_ / gen_ /
flow_ / act_ / qrtz_ / snailjob_ / undo_log 前缀时一律跳过并告警,
防止一个写错的脚本把平台表带下水。
app_install.status 是按租户的,但跑着的插件后端在进程里只有一份。
停用与卸载的实现都是 unload(关掉那个应用的子 Spring 上下文与类加载器、注销它的接口),
源码里没有像彻底删除那样的"还有别的租户在用吗"判断。
所以租户 A 停用(或卸载)一个应用之后,仍在启用它的租户 B 会看到菜单还在、但接口已经摘掉 —— 此时服务端给的是「已启用但产物未加载」这类可区分的提示,而不是一句"请求地址不存在"。
这一条是读源码得出的(停用 / 卸载都调插件的 unload,而共享闸只存在于彻底删除的清理路径里),
没有实机验证过。多租户共用一套插件后端时,建议先在自己环境上验一遍再依赖它。
如果你的部署是多租户共用,而你想让某个租户看不到这个应用,停用其实不是一个纯本租户操作。 稳妥的做法是走授权:不给该租户的角色分配那棵菜单。
相关阅读
- 安装、升级、卸载与启停 —— 两种卸载模式的操作与差别
- 装完以后:菜单与权限 —— 授权按租户落到角色上
- 数据模型 —— 三类数据与全部表的字段
- 目录中心化与版本形态 —— 目录为什么能集中
界面截图

租户管理(截图占位)
/images/docs/tenants.png建议 1920 × 1080,租户列表 + 套餐。