一篇讲透:芋道源码中的「租户」是如何通过程序控制的?

一、先别急着看代码:什么是「租户」?

1️⃣ 什么是租户(Tenant)?

SaaS 系统中:

租户 = 一套系统的一个“客户单位”

举几个直观例子:

  • 一个 OA 系统

    • A 公司是一位租户
    • B 公司是另一位租户
  • 一个进销存系统

    • 每家使用的商户 = 一个租户

特点只有一个:
👉数据必须隔离,但代码是同一套


2️⃣ 为什么芋道一定要做租户?

芋道源码是一个企业级 / SaaS 友好的后台系统,如果没有租户:

  • 所有公司用户混在一张表里
  • 一次 SQL 写错,直接全公司数据泄露
  • 后期根本没法商业化

所以芋道从一开始就设计了:

系统级多租户支持(不是 Demo 级)


二、芋道的租户方案总览(先给结论)

在芋道源码中,多租户的核心思路是:

在程序层面,自动给每一条 SQL 加上tenant_id条件

一句话总结就是:

当前请求属于哪个租户? ↓ 把租户 ID 放进上下文 ↓ SQL 执行前自动拼:tenant_id = ?

你几乎不需要自己在 SQL 里写 tenant_id


三、芋道的租户核心设计(架构层面)

1️⃣ 芋道采用的是哪种多租户方案?

多租户一般有 3 种方案:

方案说明芋道是否采用
独立数据库每个租户一个 DB
独立 Schema一个 DB,多 Schema
共享表 + tenant_id每行数据带 tenant_id采用

芋道采用的是最常见、最灵活的一种

共享表 + tenant_id 字段隔离数据


2️⃣ 数据库层面是怎么设计的?

几乎所有业务表,都会有一个字段:

tenant_idBIGINTNOTNULL

例如:

CREATETABLEsystem_user(idBIGINTPRIMARYKEY,usernameVARCHAR(50),tenant_idBIGINT,...);

❗ 注意:

  • 不是所有表都有 tenant_id
  • 像「租户表、字典表、菜单模板表」等是全局表

四、租户是怎么“进入程序”的?(最关键)

1️⃣ 租户 ID 从哪里来?

在芋道中,99% 的请求租户 ID 来自:

登录用户的 Token

流程是这样的:

浏览器请求 ↓ 携带 token(JWT) ↓ 解析 token ↓ 拿到 tenantId

这个 tenantId 会被放入一个线程上下文(ThreadLocal)中。


2️⃣ 租户上下文:TenantContextHolder

芋道内部维护了一个类似这样的类(概念简化):

publicclassTenantContextHolder{privatestaticfinalThreadLocal<Long>TENANT=newThreadLocal<>();publicstaticvoidsetTenantId(LongtenantId){TENANT.set(tenantId);}publicstaticLonggetTenantId(){returnTENANT.get();}publicstaticvoidclear(){TENANT.remove();}}

📌关键点:

  • 每个请求线程都有自己的 tenantId
  • 不同请求互不影响
  • 请求结束后会清理

五、SQL 是如何“自动加 tenant_id”的?

这是芋道多租户最精华的部分 👇

1️⃣ 芋道用的是什么技术?

MyBatis Plus + 租户插件(TenantLineInnerInterceptor)

本质是一个SQL 拦截器

SQL 执行前 ↓ 拦截 SQL ↓ 判断是否需要租户隔离 ↓ 自动拼 tenant_id 条件 ↓ 再执行

2️⃣ 举个真实效果的例子

你在代码里写的 Mapper:
@Select("SELECT * FROM system_user")List<UserDO>selectList();
实际执行到数据库的 SQL:
SELECT*FROMsystem_userWHEREtenant_id=101

👉你没写 tenant_id,但系统自动帮你加了


3️⃣ 插件是怎么知道 tenant_id 的?

拦截器内部会调用:

TenantContextHolder.getTenantId()

只要当前线程有 tenantId:

  • 自动加条件
  • 不需要你干预

六、不是所有表都加 tenant_id(如何控制?)

1️⃣ 芋道如何排除“全局表”?

芋道在租户配置中,维护了一份忽略表名单

tenant:ignore-tables:-system_tenant-system_menu-system_dict_data

这些表:

  • 不拼 tenant_id
  • 所有租户共享

2️⃣ 某些接口不想要租户隔离怎么办?

芋道提供了显式关闭租户的能力

例如:

TenantContextHolder.clear();

或使用封装好的工具类,在代码块内临时关闭租户过滤

📌 常见使用场景:

  • 超级管理员
  • 定时任务
  • 跨租户统计

七、写业务代码时,你要关心什么?

1️⃣ 正常 CRUD,你几乎不用管租户

你写业务代码时:

userMapper.selectById(id);userMapper.insert(user);

芋道会帮你自动处理:

  • tenant_id 注入
  • tenant_id 查询条件

👉这是设计最成功的地方


2️⃣ 你必须注意的 4 个点(血的教训)

❌ 1. 不要手写 tenant_id 条件(除非你非常清楚)

容易导致:

  • 条件重复
  • SQL 失效
❌ 2. 不要用原生 JDBC

会绕过 MyBatis Plus 拦截器

⚠️ 3. 自定义 SQL 要确认是否被拦截

@Select、XML SQL 都会被拦截 ✔
JdbcTemplate

⚠️ 4. 定时任务里 tenantId 为空

手动设置租户上下文


八、一个完整请求的租户生命周期(强烈建议看)

HTTP 请求进入 ↓ 解析 Token ↓ 获取 tenantId ↓ TenantContextHolder.setTenantId() ↓ Controller / Service / Mapper ↓ MyBatis 拦截 SQL,加 tenant_id ↓ 请求结束 ↓ TenantContextHolder.clear()

💡 你理解了这条链路,就理解了芋道 90% 的多租户设计


九、芋道租户设计适合什么项目?

✅ 非常适合

  • SaaS 系统
  • 多客户后台
  • 中小企业管理系统
  • 二次开发商业项目

⚠️ 不太适合

  • 超大规模分库分表
  • 强物理隔离(金融级)

十、总结(给小白的最终结论)

用一句话概括芋道的租户设计:

芋道通过 ThreadLocal 保存租户上下文,
再通过 MyBatis Plus 拦截器自动拼接 tenant_id,
实现“对业务代码几乎无侵入”的多租户隔离。

你作为新手,只需要记住:

  1. 租户 ID 来自登录用户
  2. 你不用手写 tenant_id
  3. SQL 自动生效
  4. 小心绕过 MyBatis 的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凤希AI伴侣开发手记:那些只有深度使用才暴露的“缺点”

大家好&#xff0c;我是凤希。现在是2026年1月6号晚上七点多&#xff0c;我才开始整理昨天的工作。这几天&#xff0c;我的作息完全颠倒了&#xff0c;经常早上七八点才睡&#xff0c;下午四点才起&#xff0c;活脱脱一个“美国时间”。为啥&#xff1f;因为这几天我几乎把所有…

计算机深度学习毕设实战-基于python深度学习的树叶健康识别机器学习

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

芋道(Ruoyi-Vue-Pro)对接腾讯云短信:没配回调URL,为啥也能看到发送成功/失败?如何排查?

很多人第一次把芋道&#xff08;Ruoyi-Vue-Pro / 芋道源码&#xff09;接到腾讯云短信时&#xff0c;都会遇到一个“看起来矛盾”的现象&#xff1a;我在芋道里没有配置短信回调 URL但在【短信日志】里却能看到&#xff1a; ✅ 发送成功❌ 发送失败同时【接收状态】又常常显示“…

Memcached vs Redis:面试必看的彻底解析

文章目录Memcached 与 Redis 的区别&#xff1f;闫工来告诉你&#xff01;一、Memcached&#xff1a;轻量级缓存界的“闪电侠”1.1 Memcached 的特点1.2 Memcached 的适用场景1.3 Memcached 的配置与使用示例二、Redis&#xff1a;全能型的“瑞士军刀”2.1 Redis 的特点2.2 Red…

ZGLanguage 解析SQL数据血缘 之 提取子查询语句中的源表名

# 假设存在 子查询SQL代码 如下&#xff1a;SELECT CL.OBJECTNO, PP.PAYDATEFROM NYBDP.O_SS_CL_LOAN_ACCT_STATIS CLLEFT JOIN (SELECT AL.PAYDATE, BC.BUSS_NOFROM O_CWWS_ACCT_LOAN ALINNER JOIN NYBDP.O_CWWS_BUSINESS_DUEBILL BDON 11LEFT JOIN O_CWWS_BUSINESS_CONTRACT …

typescript-var和let作用域

什么是作用域&#xff1f;作用域可以理解为某个变量在某个范围内是可以访问到。var是函数作用域&#xff08;声明的函数内&#xff09;、全局作用域&#xff08;在哪里都可以访问到&#xff09;let是块级作用域&#xff08;即程序中的大括号{}包含的范围内&#xff09;看下面的…

高精度双极板体积电阻率测试仪

高精度双极板体积电阻率测试仪 说明高精度双极板体积电阻率测试仪①电阻率ρ不仅和导体的材料有关&#xff0c;还和导体的温度有关。在温度变化不大的范围内&#xff0c;几乎所有金属的电阻率随温度作线性变化&#xff0c;即ρρo(1at)。式中t是摄氏温度&#xff0c;ρo是O℃时…

2026年香港服务器走CN2线路具有哪些优势?

2026 年香港服务器走 CN2 线路具有哪些优势?先说 CN2&#xff0c;CN2 线路作为中国电信的优质网络通道&#xff0c;通过独立路由和优先级保障&#xff0c;为香港服务器赋予了显著优势。1.速度优势&#xff1a;低延迟与高带宽的完美结合CN2线路通过优化路由跳转&#xff0c;大幅…

2026年香港服务器走CN2线路具有哪些优势?

2026 年香港服务器走 CN2 线路具有哪些优势?先说 CN2&#xff0c;CN2 线路作为中国电信的优质网络通道&#xff0c;通过独立路由和优先级保障&#xff0c;为香港服务器赋予了显著优势。1.速度优势&#xff1a;低延迟与高带宽的完美结合CN2线路通过优化路由跳转&#xff0c;大幅…

都在做「WAN优化」,南凌科技的方案究竟有何不同?

在企业数字化转型过程中&#xff0c;WAN优化已成为常见需求。面对市场上众多看似雷同的“降本增效”方案&#xff0c;IT管理者往往难以抉择&#xff1a;究竟哪家能真正解决问题&#xff1f;事实上&#xff0c;许多传统WAN优化方案仅从单点入手&#xff0c;例如数据压缩或协议加…

香港服务器为何需要IPMI?好用吗

在当今数字化时代&#xff0c;香港作为全球重要的数据中心枢纽&#xff0c;其服务器托管服务备受企业青睐。对于使用香港服务器的用户而言&#xff0c;IPMI(智能平台管理接口)是一个关键且实用的技术工具。那么&#xff0c;香港服务器为何需要IPMI?它又是否好用呢?香港服务器…

彻底解决启动问题:如何修复错误代码0xc000000e一站式教程

遇到错误代码0xc000000e可能意味着您的系统启动文件有问题&#xff0c;这可能导致电脑无法正常启动。本文将详细介绍错误代码0xc000000e的原因及其修复方法&#xff0c;帮助您快速恢复电脑正常使用。错误代码0xc000000e通常与什么系统问题相关&#xff1f;1.启动配置数据&#…

喜报!这3本SCI/ESCI成功解除“On Hold”!

据科睿唯安数据库全年更新记录统计&#xff0c;2025年度共668本期刊的变动。其中&#xff0c;新增收录期刊481本&#xff0c;被剔除期刊129本&#xff0c;名称变更期刊58本。被剔除的期刊中&#xff1a;• ESCI&#xff1a;93本&#xff08;占比最高&#xff0c;主要剔除区域&a…

【心脏病检测】基于matlab GUI检测胎儿心脏病【含Matlab源码 14854期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

云原生ETL方案:AWS Glue vs Azure Data Factory

云原生ETL方案&#xff1a;AWS Glue vs Azure Data Factory 关键词&#xff1a;云原生、ETL、AWS Glue、Azure Data Factory、数据处理 摘要&#xff1a;本文旨在对比云原生环境下的两大ETL方案——AWS Glue和Azure Data Factory。我们将深入剖析它们的核心概念、工作原理、算法…

免费听书神器喜马拉雅v9.4.32.3精简版分享 解锁付费内容 无限畅听

平时喜欢听音频的小伙伴&#xff0c;应该都对喜马拉雅不陌生吧&#xff1f;作为国内最大的音频分享平台&#xff0c;上面的内容真的太丰富了&#xff0c;不管是通勤路上解闷的段子、睡前助眠的小说&#xff0c;还是学习提升的培训课程、了解时事的新闻资讯&#xff0c;基本上想…

牛批了,Windows搬家神器

C盘有的时候会出现空间不够的情况&#xff0c;大部分老机器会经常出现&#xff0c;解决办法是重做系统&#xff0c;但是这种方法非常耗时间&#xff0c;而且安装的各种软件需要重新装一遍&#xff0c;非常的麻烦。如果不想做系统的话&#xff0c;可以用今天给大家推荐的C盘软件…

Katalon StudioAssist:智能化测试助手

在自动化测试领域&#xff0c;高效地设计、生成和维护测试脚本一直是测试工程师面临的核心挑战。Katalon Studio作为一款广泛使用的集成测试平台&#xff0c;其内置的AI助手——StudioAssist&#xff0c;正致力于通过人工智能技术重塑这一工作流程。本文将系统性地介绍StudioAs…

FTP登陆工具SmartFTP Client Enterprise v10.0.3300 多语便携版下载 FTP文件传输神器

经常需要在本地电脑和远程服务器之间传输文件的小伙伴&#xff0c;肯定都遇到过这些糟心事&#xff1a;用的FTP客户端只支持单一协议&#xff0c;遇到SFTP、WebDAV格式的文件就束手无策&#xff1b;大文件传输到一半突然断网&#xff0c;重新传输又要从零开始&#xff0c;既浪费…

Katalon StudioAssist Ask模式:工作区内的AI测试助手

在自动化测试领域&#xff0c;高效地编写脚本、理解复杂概念或排查问题是日常工作的一部分。传统上&#xff0c;这需要开发者翻阅大量文档、在社区提问或反复调试。Katalon Studio 推出的 StudioAssist Ask 模式&#xff0c;就像一位始终在线的专家伙伴&#xff0c;将人工智能的…