系统多租户使用

系统多租户使用

PIGCLOUD

📄 系统多租户使用 _ PIGCLOUD

](https://www.pig4cloud.com/)

产品

商业版

生态🔥

📄 系统多租户使用

pigcloud

PigX 多租户实现方式

  • 多个租户共享同一个数据库(Database)和模式(Schema)
  • 通过表中的 TenantID 字段区分不同租户的数据
  • 系统会自动维护租户 ID,开发时无需手动处理

多租户架构图

# 使用方法

# 1. 数据表配置

在需要支持多租户的表中添加 tenant_id 字段:

# 2. 租户隔离配置

有两种配置方式:

# 方式一:使用注解(v5.4+)

在实体类上添加注解:

1
2
3
4
5
6
@TenantTable




Copied!

# 方式二:YAML 配置

在对应微服务的 nacos 配置中添加:

1
2
3
4
5
6
7
8
9
pigx:
tenant:
column: tenant_id # 租户ID字段名
tables: # 需要进行租户隔离的表
- sys_user



Copied!

# 高级用法

# 手动切换租户

注意事项

禁止在实体对象中直接设置 tenant 字段,这会导致错误

正确的切换方式是使用 TenantContextHolder:

1
2
3
4
5
6
TenantContextHolder.setTenantId(tenantId);




Copied!

# 跳过租户过滤

在需要查询所有租户数据时:

1
2
3
4
5
6
TenantContextHolder.setTenantSkip();




Copied!

示例:

# 域名自动匹配功能

当需要通过域名自动识别租户时:

  1. 在租户管理中配置租户对应的域名:

  2. 在前端开启域名匹配功能:

# 技术实现原理

系统基于 MyBatis-Plus 的多租户 SQL 解析器 (opens new window)实现,主要包含:

# 1. 租户 ID 传递

通过全局过滤器获取并存储租户 ID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TenantContextHolderFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
// 从请求头获取租户ID
String tenantId = request.getHeader(CommonConstants.TENANT_ID);

// 设置租户上下文
if (StrUtil.isNotBlank(tenantId)) {
TenantContextHolder.setTenantId(Integer.parseInt(tenantId));
} else {
TenantContextHolder.setTenantId(CommonConstants.TENANT_ID_1);
}

filterChain.doFilter(request, response);
TenantContextHolder.clear();
}
}




Copied!

# 2. 跨线程租户信息传递

使用阿里巴巴的 TransmittableThreadLocal 实现:

1
2
3
4
5
6
7
8
public class TenantContextHolder {
private final ThreadLocal<Integer> THREAD_LOCAL_TENANT = new TransmittableThreadLocal<>();
}




Copied!

📄 基础工具类库使用 📄 swagger 接口文档

  • 标题: 系统多租户使用
  • 作者: PIGCLOUD
  • 创建于 : 2024-01-01 00:00:00
  • 更新于 : 2025-09-22 14:27:28
  • 链接: https://anime-blog.52lin.site/📄 系统多租户使用 _ PIGCLOUD/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。