📄 系统多租户使用
内部资料,请扫码登录
pigcloud
# 租户功能说明
pigx 提供多租户功能是基于租户共享同一个 Database、同一个 Schema,但在表中通过 TenantID 区分租户的数据的模式。
pigx 增删改查方法时,会自动维护租户 ID,不需要手动处理,即可实现通过租户 ID 过滤的效果
# 1. 目标表中预留 tenant_id 字段.
# 2. 配置 PIGX 租户隔离表
# 方式一: 在对应微服务模块的 nacos 配置
v5.4+支持,数据库表对应的实体增加 @TenantTable 注解
@TenantTable
# 方式二: 在对应微服务模块的 nacos 配置
# 在对应微服务模块的 nacos 配置
pigx:
tenant:
column: tenant_id
tables:
- sys_user
# 域名自动匹配
- 当租户管理维护了对应租户对应的域名时
- 前端开启自动根据请求域名匹配租户即可
版本适配说明
如下截图适配 v5 版本
# 实现原理
参考 mybatis-plus 的多租户 SQL 解析器 (opens new window)
- pigx 上下传递的前端传递的租户 ID,全局拦截器拦截传递的租户 ID 放到 theadlocal 中
public class TenantContextHolderFilter extends GenericFilterBean {
@Override
@SneakyThrows
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String tenantId = request.getHeader(CommonConstants.TENANT_ID);
log.debug("获取header中的租户ID为:{}", tenantId);
if (StrUtil.isNotBlank(tenantId)) {
TenantContextHolder.setTenantId(Integer.parseInt(tenantId));
} else {
TenantContextHolder.setTenantId(CommonConstants.TENANT_ID_1);
}
filterChain.doFilter(request, response);
TenantContextHolder.clear();
}
}
- theadlocal 是跨线程传递租户 ID 这里使用的是 TransmittableThreadLocal (阿里巴巴开源),非常方便
public class TenantContextHolder {
private final ThreadLocal<Integer> THREAD_LOCAL_TENANT = new TransmittableThreadLocal<>();
}
# 如何强制切换租户
在增删改过程中请勿对 实体的 tenant 字段手动赋值,不然报错
正确方式在调用 mapper 时候,调用 如下方法即可。
TenantContextHolder.setTenantId
- 示例代码
# 如何跳过租户过滤
- 在调用 Mapper 的方法之前,指定跳过
TenantContextHolder.setTenantSkip()