多租户的 4 种常用方案!

基于 SpringBoot 实现多租户架构:支持应用多租户部署和管理! 最后需要实现一个租户管理的功能,以便在系统中管理不同的租户。具体来说,我们可以使用Spring Cloud的服务注册与发现组件Eureka来注册每个租户的实例,并在管理界面中进行相应的操作。公有云环境指的是由云服务商搭建并对外提供服务的云环境,用户可以根据需要购买相应的云服务,如云存储、云计算、云数据库等。每个租户的服务都在注册中心以不同的应用名称进行注册,客户端可以通过服务名称来访问对应租户的服务。租户信息的维护包括添加、修改、删除、查询等操作,要求能够根据租户名称或租户ID快速查找对应的租户信息。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本 

来源:苏三说技术


前言

某中型电商平台的报表系统曾在深夜突然崩溃,起因竟是运营误删了共享表中的某租户数据列。

运维团队排查发现,因为缺乏有效租户隔离,一条误操作的ALTER TABLE语句导致全平台数据混乱。

这让我们警惕:选择多租户方案的每一步,都是安全与成本的权衡 。

今天这篇文章就跟大家一起聊聊,多租户的4种常用方案,希望对你会有所帮助。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

一、字段隔离方案

低成本背后的高风险

字段隔离方案,是通过统一数据表+租户ID过滤 实现逻辑隔离。

如下图所示:

初期开发成本极低,但将数据安全的压力完全转移到了代码质量控制上。

致命缺陷检查清单 :

  • 任意一次DAO层查询漏加tenant_id条件 → 数据跨租户泄露

  • 索引必须将tenant_id作为最左前缀 → 性能瓶颈风险

  • 全表扫描类查询(如报表统计)无法避免跨租户干扰

代码防御示范

(1)MyBatis拦截器自动注入租户ID

@Intercepts({@Signature(type = Executor.class, method = "update")})  
publicclass TenantInterceptor implements Interceptor {  
    public Object intercept(Invocation iv) throws SQLException {  
        MappedStatement ms = (MappedStatement) iv.getArgs()[0];  
        Object param = iv.getArgs()[1];  
        
        // 实体类自动填充tenant_id  
        if (param instanceof BaseTenantEntity) {  
            Field tenantIdField = param.getClass().getDeclaredField("tenantId");  
            tenantIdField.setAccessible(true);  
            if (tenantIdField.get(param) == null) {  
                tenantIdField.set(param, TenantContext.get());  
            }  
        }  
        return iv.proceed();  
    }  
}

(2)SQL防火墙:强制全表扫描必须声明租户范围

/* 危险操作(可能扫全表) */  
SELECT * FROM orders WHERE status = 'PAID';  


/* 安全写法(强制tenant_id过滤) */
SELECT * FROM orders   
WHERE tenant_id = 'tenant_01'
  AND status = 'PAID'
/* 必须添加LIMIT防止全量拉取 */
  LIMIT 1000;

适用场景建议

  • 初期快速验证的MVP产品,用户量比较少的业务系统。

  • 对数据隔离要求较低的内部管理系统。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

二、Schema隔离

数据库层的单元房

在同一个数据库实例中为每个租户独立Schema,实现库级别隔离 。

如下图所示:

各租户表结构相同但数据独立,像小区里的不同住户单元。

运维警告清单 :

  • 百级Schema数量级后,备份与迁移成本陡增

  • 跨Schema关联查询必须引入中间聚合层

  • 数据库连接池需按最大租户数配置 → 连接风暴风险

动态路由代码实现

(1)Spring动态数据源配置

spring:  
  datasource:  
    dynamic:  
      primary: master  
      strict: true  
      datasource:  
        master:  
          url: jdbc:mysql://主库地址  
        tenant_001:  
          url: jdbc:mysql://从库地址?currentSchema=tenant_001  
        tenant_002:  
          url: jdbc:mysql://从库地址?currentSchema=tenant_002

(2)AOP切面动态切换Schema

@Aspect  
@Component
publicclass SchemaAspect {  


    @Before("@annotation(requireTenant)")  
    public void switchSchema(JoinPoint joinPoint) {  
        HttpServletRequest request = getCurrentRequest();  
        String tenantId = request.getHeader("X-Tenant-ID");  
        
        // 验证租户合法性  
        if (!tenantService.isValid(tenantId)) {  
            thrownew IllegalTenantException("租户身份异常!");  
        }  
        
        // 动态切换数据源  
        DynamicDataSourceContextHolder.push(tenantId);  
    }  


    @After("@annotation(requireTenant)")  
    public void clearSchema() {  
        DynamicDataSourceContextHolder.clear();  
    }  
}

适用场景建议

  • 需要中等安全级别的行业(教育、零售)。

  • 租户数<50且数据规模可控的系统。

三、独立数据库

数据隔离的终极形态

每个租户享有独立数据库实例 。

如下图所示:

从存储到底层连接完全隔离。

安全性最高但成本呈线性增长。

财务预警清单 :

  • 每个实例约增加¥3000/月(云RDS基础配置)

  • 跨租户数据聚合需额外ETL系统支持

  • DBA运维成本随租户数量直线上升

数据源动态路由核心代码

(1)抽象路由控制器

public class TenantDataSourceRouter extends AbstractRoutingDataSource {  


    @Override
    protected Object determineCurrentLookupKey() {  
        return TenantContextHolder.get();  
    }  


    @Override
    protected DataSource determineTargetDataSource() {  
        String tenantId = (String) determineCurrentLookupKey();  
        DataSource ds = dataSourceMap.get(tenantId);  
        if (ds == null) {  
            ds = createNewDataSource(tenantId);  // 动态创建新租户数据源  
            dataSourceMap.put(tenantId, ds);  
        }  
        return ds;  
    }  
}

(2)多租户事务同步器(关键!)

@Bean  
public PlatformTransactionManager transactionManager() {  
    return new DataSourceTransactionManager() {  
        @Override  
        protected void doBegin(Object transaction, TransactionDefinition definition) {  
            TenantDataSourceRouter router = (TenantDataSourceRouter) getDataSource();  
            router.initTenantDataSource(TenantContextHolder.get());  // 确保事务绑定正确数据源  
            super.doBegin(transaction, definition);  
        }  
    };  
}

适用场景建议

  • 金融、医疗等强合规行业

  • 付费能力强且需要独立资源池的KA客户

四、混合架构

没有银弹的平衡术

核心原则 :按租户等级提供不同隔离方案

在系统中创建租户时,根据租户的实际情况,给它分配一个等级。

不同的等级,使用不同的隔离方案。

如下图所示:

租户等级

隔离方案

资源配置

S级

独立数据库

独占RDS实例+只读副本

A级

Schema隔离

共享实例独立Schema

B级

字段过滤

共享表

动态策略选择器

针对不同的租户,我们可以使用策略模式,根据不同的等级,选择不同的数据库访问方式。

代码如下:

public class IsolationStrategyFactory {  


    public IsolationStrategy getStrategy(String tenantId) {  
        TenantConfig config = configService.getConfig(tenantId);  
        switch(config.getLevel()) {  
            case VIP:  
                returnnew IndependentDBStrategy();  
            case STANDARD:  
                returnnew SchemaStrategy();  
            case BASIC:  
            default:  
                returnnew SharedTableStrategy();  
        }  
    }  


    // 示例策略接口  
    publicinterface IsolationStrategy {  
        DataSource getDataSource();  
        void executeQuery(String sql);  
    }  
}

运维避坑必读

  1. 元数据管理 :建立租户-资源映射表,避免配置漂移

  2. 迁移工具链 :开发自动化升降级工具(如VIP客户从共享表迁移到独立库)

  3. 监控分层 :不同方案的性能指标需独立采集分析

总结

这篇文章列举了多租户的4种常用方案。

没有最完美的,只有最合适的。

多租户设计的本质是资源、安全、成本的黄金三角博弈 。

与其追求理论完美,不如根据业务阶段选择最适方案。

毕竟能用可控成本解决问题的,才是真正的架构智慧。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
图解:什么是多租户? 多租户是SaaS(软件即服务)领域里特有的一个概念。在SaaS服务中,“租户”指的就是使用这个SaaS系统的客户。那么租户和用户有什么区别呢?举个例子。假设你正在使用一款面向企业(ToB)的SaaS产品,"用户"通常指的是公司里实际操作这个SaaS系统的员工。而"租户"则代表整个公司或组织。也就是说,一个租户下可能包含多个用户。多租户技术是一种软件架构,它允许多个租户共享同一个系统实例,同时确保每个租户的数据和行为互相独立、互不干扰。 阅读详情

相关推荐

芋道源码解读之多租户

租户(Tenant)是系统中的一个逻辑隔离的单元,代表一个独立使用系统的组织(如企业、高校等),在多租户系统中,不同租户共享相同的应用程序和基础设施,但各自拥有独立的数据、配置、组织架构及用户等。

Liu Zijian‘s Blog 1888

5分钟轻松学习多租户概念

背景 随着云原生不断发展,多租户的概念逐渐火起来了,在公司内部很多地方都有用到,比如后台管理平台、网关等等。 介绍 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术. 多租户简单来说是指一个单独的实例可以为多个组织服务。多租户技术为共用的数据中心内如何以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍然可以保障客户的数据隔离 为什么要多租户 ...

好吗好的~的技术博客 4920

【SaaS】多租户系统设计

它定义了运行时的应用程序数据、应用程序的基础功能,以及特定租户的数据和自定义(如果有的话)。基于以上的分析,我们选择采用分片多租户的模型,因为这样可以获得无限的扩展能力,且对租户数据的隔离性也比较好。第 4 级(乌托邦):如同第 3 级,除非你可以找出有效的方式,以在不同的“实例”上运行不同版本的软件。其次,分片模式的扩展性很强,它可以是一个分片一个租户,也可以是一个分片多个租户,具体要看具体的分片策略。首先,第一种模式中不同租户的库是可以分别扩展的,也就是结构可以不一样,但分片多租户的是同一种数据结构。

DreamSun的博客 2051

SaaS架构:多租户系统架构设计

多租户技术是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。它是为共用的数据中心内如何以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍可保障客户的数据隔离。简单来说是一个单独的实例可以为多个组织服务。

youdingte的博客 8696

SaaS 多租户【字段隔离】

本章节,将介绍多租户的基础知识、以及怎样使用多租户的功能。

liuyuqi176的博客 1654

多租户适配、多租户隔离

多租户适配 很多产品只有专属化版本,需要从产品底层进行尽量少的改造,满足上云之后多租户的数据、缓存、定时任务等隔离 多租户适配条目 条目名称 适配方案 持久层适配 支持schema和字段隔离两种方案 quartz定时任务 上下文无法获取租户信息,通过JobGroup识别 reids缓存 缓存key体现租户id即可 websocket场景 从cookie获取、前端调用diwork的api获取租户信息塞到cookie,后端websocket握手后从cookie获取 1. 持久

killerdd7的博客 1907

多租户架构

前段时间公司产品进行了架构的进化,进化到了多租户架构。当我第一次听到多租户时,我也挺纳闷,不理解。但当我逐渐的翻阅资料,以及研发功能时。不断的加深了对多租户的理解。尽管我现在也只是浅浅的懂一点而已。 OK,Let’s get this straight(让我们搞懂它),接下来让我们问自己几个问题: 1.什么是多租户架构?   2.多租户架构的优缺点?   3.多租户架构的适用场景? 让我们带着这几...

mufengmozi的博客 1233

离线环境下 Ubuntu 22.04 制作自定义apt源 安装 Docker环境 的部署方案

本文介绍了一种在无外网环境下部署服务器项目的离线方案。通过在外网环境中制作包含APT软件包和Docker镜像的离线资源包,实现在内网环境中的完整部署。方案详细说明了离线APT源的制作方法、Docker镜像的导出/导入流程,以及内网服务器的软件安装和网络配置步骤。特别强调了版本一致性、目录结构规范和网络适配等注意事项,适用于需要严格隔离网络的生产环境部署。该方案具有可扩展性,可根据实际需求调整软件包和镜像列表。

mmx_2022的博客 654

4种多租户数据库设计方案对比及思考,一文全讲透

超详实技术设计方案!

在数字化道路无限探索 9324

ISE 14.7 MCS文件的生成--- Spartan3AN XC3S200AN

步骤一: Generate Programming File生成 .bit文件 步骤二: Tools——>iMPCAT 步骤三: iMPACT Flows——>双击“Create PROM File(PROM File Formatter)” 步骤四: Non-Volatile FPGA——>点击”Spartan 3AN“——>点击“绿色箭头”——>Spartan3AN(bits)——>选择“xc3s200an"——>点击”Add storage Device“—

qq_40039676的博客 2101

逆向拆解dy接口a_bogus 1.0.1.19版本核心算法(纯算版)第二部分

本文深入解析了dy接口a_bogus 1.0.1.19版本的核心算法,重点介绍了逆向分析的基础方法论、魔改Base64编码识别与还原、随机数生成与位运算解析等关键技术。通过详细的代码示例和实用技巧,帮助开发者掌握逆向工程中的关键步骤,特别是针对a_bogus参数的生成逻辑和混淆处理。

weixin_29288313的博客 411

云原生多租户架构:SaaS 平台基于 K8s 实现租户隔离的 4 个核心方案

metadata:labels:---metadata:labels:tenant: tenant-a # 租户标签spec:selector:template:metadata:labels:spec:env:@Bean@Bean@Bean// 默认SaaS 多租户架构没有银弹。小规模、高安全要求?→ 用命名空间隔离;中等规模、成本敏感?→ 用网络策略 + 应用层租户感知;大规模、高安全?→ 用服务网格 + 多数据源;超大规模标准化 SaaS?

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Win10系统下AppScan 10.0.0安装破解全流程(附百度网盘资源)

本文详细介绍了在Windows 10系统上安装和配置AppScan 10.0.0进行Web漏洞扫描的完整流程。内容涵盖环境准备、分步安装、核心文件部署、许可证配置及首次扫描实践,旨在帮助开发人员和安全爱好者快速搭建专业的Web应用安全扫描环境,并提升扫描效率。

u8v9w0x1y的博客 368

Kubernetes多租户实践

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。,可以限制在命名空间中部署的资源以及可用的内存、CPU等。

残星说梦话 1211

使用JAVA代码转word文档之动态生成数据填充(图文详解)

今天跟公司对接了业务,根据业务需求,乙方需求文档是word格式的,而我们的数据是动态数据,每生成一份数据,就要以word的形式给乙方一份邮件!这就给了我们的工作一定的难度和挑战! 通过阅读资料,团队的帮助以及自我测试,终于实现了这个功能!因为在搜索资料方面,发现各位博主讲的比较模糊,自己碰到了很多bug,浪费了很多宝贵的时间,所以今天写了这篇文章,希望对自己以后或者他人有所帮助! 操作第一步:先准...

huaiyan 7720

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.youkuaiyun.com/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

Nacos - 多租户场景下的权限隔离方案

Nacos多租户权限隔离方案摘要 Nacos作为微服务架构中的核心组件,在多租户场景下需要实现有效的权限隔离。本文探讨了基于命名空间的多租户隔离机制,分析了权限隔离的必要性(数据安全、资源隔离、责任明确、合规性),并详细介绍了命名空间的核心作用、创建方式及Java客户端使用方法。文章还提供了通过Nacos控制台和API创建命名空间的示例代码,帮助开发者在共享Nacos实例的同时,确保不同租户间的逻辑隔离和独立管理能力。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4704

多用户与多租户的区别

多用户与多租户的区别 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: 多用户与多租户的区别 作者:满城风絮2013 出处:cnblogs 看图秒懂多租户,形象具体! 作者:openfea 出处:csdn 如何理解多租户架构? 作者:平凡21 出处:cnblogs 1 多用户 现代软件一般属于多用户的应用,也就是说,同一台机器同一套软件可以为多个用户建立各自的账户,也允许拥有这些账户的用户同时登录这台计算机。这就涉及到计算机用户和资源的管理。简单地说就

迷路剑客个人博客 6103

【Python机器学习】决策树与随机森林:解释性与鲁棒性的平衡

本文深入探讨了决策树和随机森林在解释性与鲁棒性之间的权衡。决策树以其完美的可解释性、快速的推理速度和无需特征标准化等优势,在许多场景中仍然是首选算法。一个经过合理剪枝的决策树,其每个决策路径都可以转化为业务规则,这在金融风控、医疗诊断等对透明度有严格要求的领域无可替代。然而,单棵决策树的高方差和容易过拟合的特性限制了其泛化能力。随机森林通过集成学习的思想,巧妙地解决了这个矛盾。它维持了相对较好的解释性(通过特征重要性、OOB估计等方式),同时通过多棵树的投票或平均,大幅降低了模型的方差。

nmdbbzcl的博客 628

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

(24)多租户 SaaS 平台设计

今天我们要聊的是SaaS平台中的"多租户"技术 —— 这就像是一栋高科技公寓楼,多个租户共享基础设施,却又能保持各自的独立空间。如何在Java应用中实现这种"共享但隔离"的魔法?一个面向中小型商家的电商SaaS平台,支持数千商家入驻,每个商家拥有独立的商品、订单和客户数据。:实现专用的跨租户查询服务,采用分布式查询引擎。- 利用区块链技术提供不可篡改的租户数据边界。- 基于事件驱动的无服务架构,按需分配资源。:实现租户数据迁移服务,支持在线无缝迁移。本文首发于我的技术博客,转载请注明出处。

真实的菜的博客 1244

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 9.3k star,这款融合AI助手的新一代终端工具太实用了!)
下一篇: SpringBoot + Flowable并集成ui,写一个请假流程Demo!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值