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

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);}}
http://www.xdnf.cn/news/13855.html

相关文章:

  • Catch2 开源库介绍与使用指南
  • 【threejs】每天一个小案例讲解:常见材质
  • oracle 23ai json简单使用
  • reactive() 和 toRef()
  • 微服务架构中的 Kafka:异步通信与服务解耦(四)
  • 《哈希算法》题集
  • 最新Transformer模型及深度学习前沿技术应用
  • python学习---dayday2
  • 使用文件的基本操作和文件内容读写操作实现三个功能
  • 中间件是微服务架构的支撑工具,微服务是中间件的应用场景之一。
  • 基于PHP的图书商城(vue版)
  • 拨码开关(DIP Switch)原理、参数、选型与应用指南
  • Linux x86_64架构下的四级分页机制详解
  • Cordova移动应用对云端服务器数据库的跨域访问
  • 图像处理与机器学习项目:特征提取、PCA与分类器评估
  • AI基础知识(07):基于 PyTorch 的手写体识别案例手册
  • 一篇文章理解js闭包和作用于原理
  • 【消息队列】——如何使用Actor模型解决并发问题
  • 基于springboot视频及游戏管理系统+源码+文档
  • Python图像处理基础(六)
  • 域名证书自动更新-acme通用版
  • 网络编程之Modbus与HTTP
  • MySQL中InnoDB存储引擎底层原理与MySQL日志机制深入解析
  • 【在线五子棋对战】五、前端扫盲:html css javascript ajax jquery websocket
  • 应用案例丨一键测量300+工件,QM系列闪测仪批量检测
  • 多模态大语言模型arxiv论文略读(119)
  • 爱普生FC-135R晶振在广域网LoRa设备中的应用
  • 达梦数据库中无效触发器的排查与解决方案指南
  • Java Lambda 表达式与 Stream API 全解析:从基础到进阶
  • 短剧小程序开发:开启碎片化娱乐新视界