Skip to content

多租户

简介

多租户(Multi-tenancy)是一种软件架构设计模式,允许多个独立用户或组织(称为“租户”)共享同一套应用程序、数据库或基础设施,同时确保每个租户的数据和配置相互隔离。这种架构在云计算和SaaS(软件即服务)领域尤为常见。

核心特点

  1. 资源共享 多个租户共享同一套底层资源(如服务器、数据库、计算资源),降低硬件和维护成本。

  2. 隔离性 每个租户的数据、配置和用户权限相互隔离,确保安全性和隐私性。

  3. 可扩展性 支持动态增减租户数量,便于横向扩展(如新增服务器或数据库分片)。

  4. 定制化 租户可以自定义部分功能或界面(如品牌Logo、业务流程),而无需影响其他租户。

MMS使用

  1. 开启多租户

enable: true

yaml
--- # 多租户
tenant:
  # 是否开启租户模式
  enable: true
  1. 可以设置忽略的表

也可以用注解配置某一条数据的查询方法

java
 //忽略多租户
 @InterceptorIgnore(tenantLine = "true")
 @Select("SELECT * FROM sys_user")
 List<User> selectAllUsers();
yaml
--- # 多租户
tenant:
  # 是否开启租户模式
  enable: true
  # 需要排除的多租户的表
  exclusionTable:
    - sys_menu
    - sys_tenant
    - sys_tenant_package
    - sys_role_dept
    - sys_role_menu
    - sys_user_post
    - sys_user_role
    - sys_client
    - sys_oss_config
    - other_table
  1. 租户字段名称
yaml
--- # 多租户
tenant:
  # 是否开启租户模式
  enable: true
  # 需要排除的多租户的表
  exclusionTable:
    - sys_menu
    - sys_tenant
    - sys_tenant_package
    - sys_role_dept
    - sys_role_menu
    - sys_user_post
    - sys_user_role
    - sys_client
    - sys_oss_config
    - other_table
  # 租户字段名称
  column: tenant_id

核心配置

MybatisPlusConfig.java

java
    //分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    
    //多租户插件
    if (tenantProperties.getEnable()) {
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                //获得当前登录用户的租户id
                return new StringValue(TenantContext.getCurrentTenantId());
            }
            // 租户字段名(对应数据库字段)
            @Override
            public String getTenantIdColumn() {
                return tenantProperties.getColumn();
            }

            // 忽略多租户的表或SQL(如系统表)
            @Override
            public boolean ignoreTable(String tableName) {
                List<String> exclusionList= tenantProperties.getExclusionTable();
                for (String s:exclusionList){
                    //或者sys_开头的,全部忽略,s.startsWith("sys_")
                    if(s.equalsIgnoreCase(tableName)){
                        return true;
                    }
                }
                return Boolean.FALSE;
            }
        }));
    }
    return interceptor;
}

工作原理简述

首先我们是借助MybatisPlus插件实现多租户,配置后它可以在查询数的时候在where查询条件自动追加一个 and tenant_id='' 的条件进行检索。

然后我们设置需要忽略的一些表,例如:

text
    - sys_menu:系统菜单不区分多租户
    - sys_tenant:多租户不区分
    - sys_tenant_package:多租户配置不区分
    - sys_role_dept:角色相关不需要
    - sys_role_menu:角色相关不需要
    - sys_user_role:角色相关不需要
    - ...... 具体业务场景有需要可以自行添加

Released under the MIT License.