从零到一:ruoyi-vue-pro多租户架构的SaaS落地指南

从零到一:ruoyi-vue-pro多租户架构的SaaS落地指南

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro

你是否正在构建支持多企业使用的系统?是否为数据隔离、权限控制、租户扩展等问题头疼?本文将带你深入了解ruoyi-vue-pro的多租户架构设计,掌握从配置到部署的完整实践方案,让你轻松应对SaaS系统开发挑战。读完本文,你将获得:多租户核心实现原理、数据源隔离策略、权限控制方案、部署配置指南以及常见问题解决方案。

多租户架构概述

多租户(Multi-Tenancy)是一种软件架构模式,允许单个应用实例同时为多个租户(Tenant)提供服务,同时保证各租户数据的隔离性和安全性。ruoyi-vue-pro通过yudao-spring-boot-starter-biz-tenant模块实现了完整的多租户支持,涵盖数据隔离、权限控制、缓存管理等关键能力。

多租户核心价值

  • 资源共享:降低硬件成本和运维复杂度
  • 按需扩展:支持租户数量动态增长
  • 数据隔离:确保各租户数据安全可控
  • 定制化配置:满足不同租户的个性化需求

多租户实现方式对比

实现方式隔离级别复杂度扩展性适用场景
独立数据库最高大型企业租户
共享数据库独立Schema中小型企业租户
共享数据库共享Schema小型应用或SaaS初创

ruoyi-vue-pro采用"共享数据库独立Schema"的混合策略,兼顾隔离性和资源利用率,通过MyBatis Plus的多租户插件实现SQL自动拦截和租户ID注入。

ruoyi-vue-pro多租户核心实现

架构设计概览

ruoyi-vue-pro的多租户架构通过分层设计实现全面隔离,主要包括以下层面:

mermaid

核心实现类包括:

数据源隔离实现

ruoyi-vue-pro通过MyBatis Plus的TenantLineInnerInterceptor实现SQL自动拦截,动态添加租户条件。核心配置如下:

@Bean
public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties) {
    return new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties));
}

YudaoTenantAutoConfiguration中,多租户拦截器被添加到MyBatis拦截器链的首位,确保在分页等操作前执行:

MyBatisUtils.addInterceptor(interceptor, inner, 0); // 添加到拦截器链首位

配置文件详解

多租户核心配置在TenantProperties.java中定义,主要包括:

@ConfigurationProperties(prefix = "yudao.tenant")
@Data
public class TenantProperties {
    private Boolean enable = true; // 是否开启多租户
    private Set<String> ignoreUrls = new HashSet<>(); // 忽略租户的URL
    private Set<String> ignoreTables = Collections.emptySet(); // 忽略租户的表
    private Set<String> ignoreCaches = Collections.emptySet(); // 忽略租户的缓存
}

典型应用配置示例(application.yml):

yudao:
  tenant:
    enable: true
    ignore-tables:
      - sys_config
      - sys_dict_type
      - sys_dict_data
    ignore-urls:
      - /api/auth/login
      - /api/oauth/callback

实战部署与配置

环境准备

部署多租户系统前,需准备支持Schema隔离的数据库环境,如MySQL、PostgreSQL等。以MySQL为例,可通过以下SQL创建租户Schema:

-- 创建租户1数据库
CREATE DATABASE ruoyi_vue_pro_tenant1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建租户2数据库  
CREATE DATABASE ruoyi_vue_pro_tenant2 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

数据库脚本可参考sql/mysql/ruoyi-vue-pro.sql文件,通过修改脚本中的数据库名实现多租户初始化。

核心配置步骤

  1. 启用多租户

在yudao-server/src/main/resources/application.yml中添加配置:

yudao:
  tenant:
    enable: true
    ignore-urls:
      - /api/auth/login
      - /api/oauth/callback
  1. 配置数据源路由

ruoyi-vue-pro支持动态数据源路由,通过租户ID自动切换数据源,配置类为DynamicDataSourceConfig。

  1. 设置忽略租户的表

对于系统级表(如字典表、配置表),可配置为忽略租户过滤:

yudao:
  tenant:
    ignore-tables:
      - sys_dict_type
      - sys_dict_data
      - sys_config

租户上下文管理

租户上下文通过TenantContextHolder维护,在请求处理过程中自动传递租户ID:

// 设置租户ID
TenantContextHolder.setTenantId(tenantId);
try {
    // 业务逻辑处理
    return businessService.queryData();
} finally {
    // 清除租户ID
    TenantContextHolder.clear();
}

高级特性与最佳实践

缓存隔离策略

ruoyi-vue-pro通过TenantRedisCacheManager实现缓存的租户隔离,自动为缓存Key添加租户前缀:

// 生成带租户ID的缓存Key
@Override
protected String getTenantCacheKey(String cacheName, Object key) {
    Long tenantId = TenantContextHolder.getTenantId();
    if (tenantId == null || ignoreCaches.contains(cacheName)) {
        return key.toString();
    }
    return String.format("%s::%s", tenantId, key);
}

任务调度隔离

多租户环境下的定时任务通过TenantJobAspect实现租户上下文传递:

@Around("@annotation(jobHandler)")
public Object around(ProceedingJoinPoint point, JobHandler jobHandler) throws Throwable {
    // 获取租户ID列表
    List<Long> tenantIds = tenantFrameworkService.getTenantIds();
    for (Long tenantId : tenantIds) {
        // 设置租户上下文
        TenantContextHolder.setTenantId(tenantId);
        try {
            // 执行任务
            point.proceed();
        } finally {
            TenantContextHolder.clear();
        }
    }
    return null;
}

权限控制实现

ruoyi-vue-pro结合RBAC权限模型与多租户设计,实现租户内的权限隔离。核心权限控制类为TenantSecurityWebFilter,确保用户只能访问所属租户的资源。

常见问题与解决方案

跨租户数据访问

问题:管理员需要跨租户查看数据。

解决方案:使用@TenantIgnore注解忽略特定方法的租户过滤:

@TenantIgnore
public List<SysUser> getAllUsers() {
    return sysUserMapper.selectList(null);
}

性能优化

问题:多租户环境下查询性能下降。

解决方案:

  1. 为租户ID字段添加索引
  2. 合理设置缓存过期时间
  3. 对大表进行分表处理,可以参考sql/tools/目录下的分表工具

租户初始化

问题:新租户创建后如何自动初始化数据。

解决方案:使用TenantInitializer实现租户数据初始化,包括基础数据、默认角色和权限等。

总结与展望

ruoyi-vue-pro的多租户架构通过分层设计实现了数据、缓存、权限的全面隔离,为SaaS系统开发提供了完整解决方案。核心优势包括:

  1. 配置简单:通过yudao.tenant配置即可启用多租户
  2. 全面隔离:涵盖数据、缓存、任务、权限等各层面隔离
  3. 灵活扩展:支持租户数量动态增长,适应不同规模SaaS应用

未来,ruoyi-vue-pro还将进一步优化多租户架构,包括:

  • 支持租户级别的个性化配置
  • 提供租户资源监控面板
  • 实现租户数据备份与恢复功能

通过本文的介绍,相信你已经掌握了ruoyi-vue-pro多租户架构的核心实现与最佳实践。如需深入学习,可参考项目中的官方文档示例代码。祝你在SaaS系统开发之路上一帆风顺!

如果你觉得本文对你有帮助,欢迎点赞、收藏并关注项目更新,你的支持是我们持续优化的动力!

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值