
从一次点击到一行 SQL多租户企业后台系统的全链路图解实战【免费下载链接】RuoYi-Vue-Plus多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、WarmFlow、SpringDoc、Hutool、OSS 定期同步项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus凌晨两点运营小王点下发布公告按钮的那一刻他并不知道这个动作要在认证、鉴权、租户过滤、缓存、分布式锁、SQL 生成、数据脱敏七个环节里闯关最终变成数据库里一行带着tenant_id 1001的INSERT。RuoYi-Vue-Plus就是这样一个面向多租户场景的企业级后台管理系统它把多租户数据隔离难、权限体系复杂、重复开发多这三个老大难问题用一条条可读的源码链路拆解给你看。这篇文章不打算按架构→组件→部署→调优的套路走。我们换一种方式跟着小王的那次点击沿着请求一路闯关把分布式后台管理系统搭建中最关键的设计决策全部摊开在剧情里。第一关你是用哪种姿势登录的——认证的策略工厂小王的请求最先抵达的是AuthController的/auth/login接口。这里有个容易被忽视的设计入口处整体被SaIgnore标记意味着这条路径不校验登录态毕竟还没登录但它却标了ApiEncrypt——请求体在传输层做过动态 AESRSA 加密每一次请求的密钥都不同。你可能会有疑问这样不会拖慢性能吗答案是加密只发生在登录这种低频接口上用极小的开销换对抗重放攻击的能力这笔账是划算的。真正的精妙之处在下一层。登录并不写死为账号密码一种方式而是通过grantType参数在 Spring 容器里动态找 Beanstatic LoginVo login(String body, SysClientVo client, String grantType) { String beanName grantType BASE_NAME; // 如 password AuthStrategy if (!SpringUtils.containsBean(beanName)) { throw new ServiceException(授权类型不正确!); } IAuthStrategy instance SpringUtils.getBean(beanName); return instance.login(body, client); }这段代码解决的是新增一种登录方式时零侵入。想支持短信登录写一个SmsAuthStrategy实现类容器里自然多一个 Bean前端传grantTypesms就能命中无需改动任何既有代码。这套策略 工厂的组合正是很多企业后台权限设计里最值得抄走的那一页。登录策略Bean 名称适用场景密码登录passwordAuthStrategy常规 Web 后台BCrypt 验密 图形验证码短信登录smsAuthStrategy移动端、低门槛注册邮箱登录emailAuthStrategy海外业务、企业内网社交登录socialAuthStrategy基于 JustAuth 的微信/钉钉等数十种三方认证小程序登录xcxAuthStrategy微信小程序生态小结认证层用按名字找策略替代 if-else 风暴ApiEncrypt保证登录数据不被中间人窃听客户端clientId与授权类型grantType解耦为多端多客户端管理埋下伏笔。第二关你配知道这些数据吗——注解式权限的降维打击登录成功拿到 token 后小王点开用户管理列表。后端接口长这样SaCheckPermission(system:user:list) GetMapping(/list) public RPageResultSysUserVo list(SysUserBo bo) { return R.ok(sysUserService.selectPageUserList(bo)); }这一行注解解决的是谁能看这个接口的问题。相比 Spring Security 那套动辄几十行的 SecurityConfigSa-Token 把鉴权压缩成一个注解而且支持复杂表达式SaCheckPermission(value {system:user:add, system:user:edit}, mode SaMode.OR)表示新增或编辑任一权限即放行还能做权限 OR 角色的混合判断。对业务开发者来说权限声明与业务代码同处一屏可读性提升一个量级。但要注意一个常见坑接口权限 ≠ 数据权限。SaCheckPermission只决定能不能进这个接口而进了接口能看到哪几行数据靠的是下一关。第三关多租户挤在同一张表里数据是怎么做到互不打扰的这是全文的核心也是多租户数据隔离方案这道必答题。业界通常有三条路隔离方案数据存储隔离强度成本典型场景独立数据库每租户一个库最强最高金融、政务等强合规独立 Schema每租户一个 schema强中中型 SaaS共享表 租户字段一张表存所有租户靠逻辑保证最低绝大多数 SaaS 起步期RuoYi-Vue-Plus 默认走第三条路所有业务表都带tenant_id字段而过滤动作不是由业务代码手写的。在MybatisPlusConfig里MyBatis-Plus 的拦截器链被重新组装过Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(dataPermissionInterceptor()); // 数据权限按部门/角色无感过滤行 interceptor.addInnerInterceptor(paginationInnerInterceptor()); // 分页自动识别数据库方言 interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); // 乐观锁防并发覆盖 return interceptor; }这段配置解决的是同一份业务代码在不同租户下自动带出不同的 where 条件。拦截器在 SQL 执行前介入把当前租户 ID、数据权限范围动态拼进 WHERE 子句——业务 Service 层完全感知不到这一切。小王是租户 A 的管理员他永远查不到租户 B 的公告不是因为业务代码写了只查自己而是 SQL 生成那一刻就被规则拦住了。小结多租户数据隔离方案的关键不是分库分表这种听起来很硬核的手段而是共享表 拦截器透明注入租户条件的低成本高可用组合数据权限用插件化方式叠加在租户隔离之上两层过滤互不干扰。第四关缓存与锁——集群下的同一份公告只发一次公告发布是个写操作可小王明明点了两次提交。如果没有分布式锁第二次点击大概率会重复入库。RuoYi-Vue-Plus 内置 Lock4j底层基于 Redisson一个注解搞定Lock4j(keys #noticeId, expire 5000) public void publish(Long noticeId) { /* 发公告的核心逻辑 */ }这段代码解决的是多实例部署时同一资源只能被一个节点操作。同样值得留意的还有缓存Redis 客户端选用 Redisson官方推荐的 Netty 客户端支持 90% 以上的 Redis 命令配合 Spring-Cache 的扩展注解可以在一个注解里同时声明过期时间、最大空闲时间、组最大长度把缓存雪崩这类集群事故的诱因掐死在配置层。会话状态也存于 Redis任意节点都可以续签 token这正是分布式后台管理系统搭建与单体后台的分水岭。第五关回程的路——序列化与多数据源的最后收尾数据查出来了但还不能直接返回给小王。SysUserVo里的手机号、身份证需要在 JSON 序列化阶段按不同模块的脱敏条件打码这是ruoyi-common-sensitive模块的职责字典值、部门名这类数据翻译则交给ruoyi-common-translation一个注解在序列化期间动态补齐翻译结果。至于数据库本身框架通过 dynamic-datasource 支持 MySQL、Oracle、PostgreSQL、SQLServer 以及达梦、金仓等国产数据库的异构切换主键统一采用雪花 ID——不再为分库分表、数据合并时的主键冲突发愁。你可以把它理解成底层数据库怎么换业务代码一行都不用动。实战演练5 分钟拉起一套多租户 SaaS 最小演示纸上谈兵结束我们来真的。克隆仓库后做四件事git clone https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus cd RuoYi-Vue-Plus起中间件项目自带完整的 Docker 编排script/docker/docker-compose.yml一条命令拉起 MySQL、Redis、Nginx初始化脚本在script/sql/下执行ry_vue.sql即可得到含租户、客户端、菜单权限在内的完整基础库。配连接在ruoyi-admin的配置里把数据源指向本地库JDK 21 环境下直接跑DromaraApplication主类。登后台用 admin 账号登录左侧菜单里就能看到客户端管理——在这里可以动态配置某个客户端允许的登录方式与 token 时效这是多租户 SaaS 运营侧的命门。体验代码生成器设计好一张业务表用ruoyi-gen模块一键生成全套 CRUD 代码与前端页面前后端代码风格自动对齐 Sa-Token 注解与 SpringDoc 规范这正是降低 80% 重复开发的底气所在。小结上手路径是docker-compose 起环境 → 执行 SQL → 改数据源 → 登录 → 跑代码生成器整个流程以分钟计扩展模块监控、AI、工作流都在ruoyi-extend与ruoyi-modules下按需引入不想要的依赖一个都不带。下一步从哪里入手如果你的目标是把多租户搞明白先读IAuthStrategy与MybatisPlusConfig两个文件认证策略 拦截器链这是整个框架最值得抄的两页纸如果你想快速交付业务直接从ruoyi-modules/ruoyi-system的系统管理模块开始配合代码生成器边用边理解如果你关心分布式能力去看ruoyi-common-redis与ruoyi-common-jobSnailJob 分布式任务调度的实现。至于 WarmFlow 工作流、AI 集成、SkyWalking 链路追踪建议在跑通主链路后再逐个击破——一口吃不成胖子的道理在多租户后台里同样成立。【免费下载链接】RuoYi-Vue-Plus多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、WarmFlow、SpringDoc、Hutool、OSS 定期同步项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考