当前位置: 首页 > news >正文

SpringCloud + MybatisPlus:多租户模式与实现

一、多租户的基本概念

多租户(Multi-Tenancy) 是指在一套软件系统中,多个租户(客户)共享相同的基础设施和应用程序,但数据和配置相互隔离的架构模式。其核心目标是 降低成本保证数据安全

核心特点

  1. 资源共享:租户共享服务器、数据库、代码等资源。
  2. 数据隔离:通过技术手段确保租户间数据不泄露。
  3. 配置独立:支持租户自定义配置(如界面、流程)。

隔离级别

  • 行级隔离:同一表中通过tenant_id字段区分(共享Schema模式)。
  • Schema级隔离:同一数据库下不同Schema(共享数据库独立Schema模式)。
  • 数据库级隔离:每个租户独立数据库(独立数据库模式)。
二、Spring Cloud集成MyBatis-Plus实现多租户

Spring Cloud与MyBatis-Plus结合实现多租户,需解决 租户ID传递SQL自动过滤数据填充 三个核心问题。

1. 核心组件集成
  1. API网关(Spring Cloud Gateway):从请求头/Token中提取租户ID,并向下游传递。
  2. 上下文传递:通过ThreadLocal在微服务间传递租户ID。
  3. MyBatis-Plus插件:自动在SQL中注入租户过滤条件。
  4. Feign客户端:跨服务调用时传递租户ID到请求头。
2. 租户ID全链路传递实现
(1)Spring Cloud Gateway过滤器(JwtTenantFilter)

通过GlobalFilter解析JWT并将租户ID存入上下文:

@Component
public class JwtTenantFilter implements GlobalFilter, Ordered {private final JwtUtils jwtUtils;public JwtTenantFilter(JwtUtils jwtUtils) {this.jwtUtils = jwtUtils;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 从请求头获取JWT(格式:Bearer {token})String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");if (authHeader == null || !authHeader.startsWith("Bearer ")) {return handleMissingToken(exchange);}String token = authHeader.substring(7);try {// 2. 解析JWT获取tenantIDString tenantId = jwtUtils.getTenantIdFromToken(token);if (tenantId == null) {return handleInvalidTenant(exchange);}// 3. 将tenantID存入上下文(关键点!)TenantContextHolder.setTenantId(tenantId);// 4. 添加X-Tenant-ID到请求头,传递给下游服务ServerHttpRequest newRequest = exchange.getRequest().mutate().header("X-Tenant-ID", tenantId).build();// 5. 请求结束后清除上下文,防止内存泄漏return chain.filter(exchange.mutate().request(newRequest).build()).doFinally(signal -> TenantContextHolder.clear());} catch (JwtValidationException e) {return handleJwtError(exchange, e);}}

相关文章:

  • 《网络安全与防护》知识点复习
  • Linux安装C语言环境教程
  • C# net8生成excel,并设置列规则导出文件
  • 深入剖析 Spring @Bean 注解:灵活定义与掌控你的 Bean
  • ABAP 上传 excel 报表
  • get_attribute的使用方法
  • ThreadPoolTaskExecutor+CompletableFuture实现多线程异步数据同步和自定义线程池监控和动态调整实现
  • UE5 学习系列(九)光照系统介绍
  • stm32cubeide中编译非flash起始地址开始的程序
  • 【ARMv7-A】——CLZ 指令
  • Swift 解法详解:如何在二叉树中寻找最长连续序列
  • 怎么轻松实现报表跨库移植
  • 前端Vue3国际化开发 :使用vue-i18n库和Element Plus 组件实现
  • slam--高斯分布
  • 4、程序的固化和下载(一)
  • 基于 SpringBoot + Vue 在线点餐系统(前后端分离)
  • Eplan2022更改用户界面颜色
  • 文档测试发送
  • 目标检测我来惹2-SPPNet
  • 5分钟玩转Swagger UI:Docker部署+静态化实战
  • 网站怎么做电脑系统下载/上海推广seo
  • 如何学做网站优化/品牌软文案例
  • 天津网站制作福州/电子报刊的传播媒体是什么
  • 响应式网站建设资讯/百度推广有哪些形式
  • 重庆网站建设安全/百度新版本更新下载
  • 专业网站设计公司哪里有/什么是信息流广告