多租户
简介
多租户(Multi-tenancy)是一种软件架构设计模式,允许多个独立用户或组织(称为“租户”)共享同一套应用程序、数据库或基础设施,同时确保每个租户的数据和配置相互隔离。这种架构在云计算和SaaS(软件即服务)领域尤为常见。
核心特点
资源共享 多个租户共享同一套底层资源(如服务器、数据库、计算资源),降低硬件和维护成本。
隔离性 每个租户的数据、配置和用户权限相互隔离,确保安全性和隐私性。
可扩展性 支持动态增减租户数量,便于横向扩展(如新增服务器或数据库分片)。
定制化 租户可以自定义部分功能或界面(如品牌Logo、业务流程),而无需影响其他租户。
MMS使用
- 开启多租户
enable: true
yaml
--- # 多租户
tenant:
# 是否开启租户模式
enable: true
- 可以设置忽略的表
也可以用注解配置某一条数据的查询方法
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
- 租户字段名称
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:角色相关不需要
- ...... 具体业务场景有需要可以自行添加