ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VeapAI 实战(六)一套代码服务多个租户:多租户隔离与多业务快速构建

2026/9/4 6:13:08 拓冰建站 浏览量
VeapAI 实战(六)一套代码服务多个租户:多租户隔离与多业务快速构建 摘要本文介绍 VeapAI 的多租户架构实践核心是共享表加 tenant_id 行隔离由系统拦截器统一注入租户过滤条件禁止业务代码手写 tenant_id 条件并通过 Statement 白名单与表白名单双重命中放行全局表读取。文章还梳理了动态数据源、RBAC、定时任务等企业级底座能力以及新租户接入路径和行隔离的扩展边界。 关键词多租户架构、数据隔离、动态数据源 | 首发CSDN | 同步知乎接手的项目多了会发现企业应用最大的成本不是新功能是新项目。客户 A 要一套客户 B 要一套表结构八成一样业务字段差两成。逐个部署、逐个升级运维成本比开发成本还高。VeapAI 的答案是租户化一套代码、一套部署多个租户数据隔离多业务并行交付。## 租户数据长什么样veap_tenant表注释租户信息的关键字段| 字段 | 说明 || --- | --- || pid | 上级主键租户层级 || name / title / code | 名称 / 显示标题 / 租户编码 || duty_user_id / duty_name / duty_phone | 负责人主键 / 姓名 / 电话 || globe_config | 全局配置 || del_state | 删除状态 |![租户与数据源配置]业务表普遍带 tenant_id 列veap.sql 里 wf_*、ai_* 等表都有。隔离靠的不是表分片是拦截器。## 租户过滤拦截器注入禁止手写docs/online-dev/README.md 的租户契约写得很硬- 禁止在任何自定义 SQL 中拼接 tenant_id ... / and tenant_id ... 作为过滤条件- 禁止为查询 / 列表 / 精确查询新增 tenantId 入参并用于 where / join 过滤- 可验证全仓库搜索 and tenant_id #{tenantId}、if testtenantId 在 user-code 中必须为 0。隔离由系统拦截器统一注入业务代码写 SQL 时不关心租户。这样做的反面教材见得多某张表的某个查询忘了拼 tenant_id数据串租户查了半天没人想到是漏写了一个条件。统一注入把漏写这个错误类别整个删掉了。特例走双白名单。部分全局表菜单、角色允许读 tenant_id IS NULL 的全局行但必须同时命中两个白名单- Statement 白名单 tenant.allowNullTenantIdStatementIds只放行权限计算链路的 SELECT- 表白名单 tenant.allowNullTenantIdTables默认 veap_menu / veap_role / veap_role_menu / veap_role_user。![租户隔离与双白名单]## 多业务的其它底座租户解决一套代码多客户这些能力解决一套代码多项目、多形态| 能力 | 说明 || --- | --- || 动态数据源 | MySQL 8.x Druid 动态数据源多数据源配置 || RBAC | 用户 - 角色 - 菜单 - 数据权限 || 定时任务 | Quartz 集群调度veap_job 表 veap_job_log 日志 || 缓存 / 文件 | Redis / MinIO || 限流熔断 | Sentinel || 监控 | Spring Boot Admin、操作日志、SQL 审计 |这几样都是企业项目标配单独写都能写一篇文章VeapAI 是开箱带着。## 一处较真的设计白名单不是一个开关是两个开关同时命中。见过一些系统为了兼容全局表直接放开租户拦截——结果是全局表能读串租户也一起开了。这里的设计把放开拆成两层先限定哪些 SQL 语句允许放宽Statement 白名单再限定哪些表允许表白名单。双重命中才生效出问题的概率从可能串降到几乎不可能。## 新租户接入的路径租户化的交付模式新客户接入 建一条 veap_tenant 记录 可选独立数据源 菜单权限配置代码零改动。多项目并行的成本从每人一个分支降到一个平台多份数据。## 模型说明行隔离的边界模型是共享表 tenant_id 行隔离拦截器统一注入双白名单放行全局行。扩展边界也明确需要分库时配动态数据源按租户路由模型本身不用改。这是先跑起来再按需分的务实路线。## 边界说清楚VeapAI 的租户是共享表 行隔离不是分库分表。超大规模租户数据量建议配合动态数据源把租户分库。另外本篇不写并发数字——没有实测压测数据就不编。## 复现bashcd veap-cloudmvn -B -pl veap-package/veap-monolith -am -DskipTests package建两个租户各跑一遍在线开发生成和流程配置确认数据互相不可见再翻 veap.sql 里 tenant_id 字段的分布对照双白名单配置验证全局表的读取口径。下一篇讲多表关联主子表、树表从业务建模视角怎么选。租户契约原文在 docs/online-dev/README.md 1.2 节双白名单的默认表清单也在里面https://gitee.com/mindock/veap