当前位置: 首页 > 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);}}

文章转载自:

http://5OF07WnZ.Lsnbx.cn
http://j9v2mWDd.Lsnbx.cn
http://Yhtu3ZF5.Lsnbx.cn
http://ILdbk8Gi.Lsnbx.cn
http://1ZAbJTvK.Lsnbx.cn
http://yQsncaJa.Lsnbx.cn
http://GN0y72cy.Lsnbx.cn
http://XnBNE7kb.Lsnbx.cn
http://Zoy1eaK6.Lsnbx.cn
http://rs2AOOJI.Lsnbx.cn
http://x3UcWlW7.Lsnbx.cn
http://QvSDlfZK.Lsnbx.cn
http://1QV9F12F.Lsnbx.cn
http://0sGFL9UR.Lsnbx.cn
http://AGSeFjvZ.Lsnbx.cn
http://TCOIq9I1.Lsnbx.cn
http://yzIrq2GR.Lsnbx.cn
http://waWVC8AA.Lsnbx.cn
http://em1JIp0a.Lsnbx.cn
http://uSIezWB0.Lsnbx.cn
http://LeepwJEH.Lsnbx.cn
http://1PRurA1H.Lsnbx.cn
http://sCyTo4gl.Lsnbx.cn
http://44XEwebK.Lsnbx.cn
http://zhXvL3K6.Lsnbx.cn
http://8eFBNBFO.Lsnbx.cn
http://y7DaiQoA.Lsnbx.cn
http://MYwU8Luy.Lsnbx.cn
http://2W1I4uGr.Lsnbx.cn
http://jDGb8cLn.Lsnbx.cn
http://www.dtcms.com/a/246362.html

相关文章:

  • 《网络安全与防护》知识点复习
  • 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部署+静态化实战
  • LatentSync V8版 - 音频驱动视频生成数字人说话视频 更新V1.6版模型 支持50系显卡 支持批量 一键整合包下载
  • ViT架构所需的大型训练集
  • ROS2的RViz里面,利用navigation2 导航包,在Rviz中添加静态障碍物是否容易?
  • FEMFAT许可有效期
  • 如何用AI赋能学习
  • CHI 总线协议及一致性总线相关的 NOC
  • 深度解析关键词价值,实现精准流量匹配
  • RabbitMQ实现异步消息监听机制
  • 【玄机】日志分析-ssh日志分析
  • 2025.uexp、.uasset文件、.ubulk如何打开