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.pswp.cn/news/909478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka入门:解锁核心组件,开启消息队列之旅

一、引言 Kafka以超高速吞吐、精准的路由策略和永不掉线的可靠性&#xff0c;让海量数据在分布式系统中畅行无阻。无论你是刚接触消息队列的技术小白&#xff0c;还是寻求性能突破的开发老手&#xff0c;掌握 Kafka 核心组件的运作原理&#xff0c;都是解锁高效数据处理的关键…

前端项目Excel数据导出同时出现中英文表头错乱情况解决方案。

文章目录 前言一、Excel导出出现中英文情况。二、解决方案数据处理 三、效果展示总结 前言 在前端项目中实现Excel导出功能时&#xff0c;数据导出excel是常见的业务需求。但excel导出完表头同时包含了中文和英文的bug&#xff0c;下面是我的经验分享&#xff0c;应该可以帮助…

《开窍》读书笔记8

51.学会赞美他人&#xff0c;能净化心灵&#xff0c;建立良好人际关系&#xff0c;让生活充满阳光。 52.欣赏他人的学习过程&#xff0c;能激发潜能&#xff0c;促进相互成长&#xff0c;让有点共存。 53.别因“自我”一叶障目&#xff0c;要关注他人&#xff0c;欣赏与别欣赏式…

基于 Spring Cloud Gateway + Sentinel 实现高并发限流保护机制

基于 Spring Cloud Gateway Sentinel 实现视频播放接口限流保护机制 作者&#xff1a;NovaTube 开发者 &#xff5c; 时间&#xff1a;2025-06 标签&#xff1a;Spring Cloud Gateway、Sentinel、微服务、限流、接口保护 一、背景介绍 在我们开发的在线视频分享平台 NovaTube…

CountDownLatch入门代码解析

文章目录 核心思想&#xff1a;火箭发射倒计时 &#x1f680;最简单易懂的代码示例代码解析运行流程分析 核心思想&#xff1a;火箭发射倒计时 &#x1f680; 想象一下发射火箭的场景&#xff0c;在按下最终的发射按钮之前&#xff0c;必须有好几个系统同时完成自检&#xff0…

用Python写一个可视化大屏

用Python打造可视化大屏&#xff1a;数据洞察新视界 在当今数据爆炸的时代&#xff0c;数据可视化成为了理解和传达复杂信息的关键工具。Python作为一门强大且灵活的编程语言&#xff0c;提供了丰富的库和工具&#xff0c;让我们能够创建出令人惊叹的可视化大屏。本文将带你逐步…

20250611让NanoPi NEO core开发板在Ubuntu core16.04系统下开机自启动的时候拉高GPIOG8

rootNanoPi-NEO-Core:/# touch open_4g_ec20.sh rootNanoPi-NEO-Core:/# vi open_4g_ec20.sh 【打开使能引脚200 IOG8】 echo 200 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio200/direction echo 1 > /sys/class/gpio/gpio200/value 【切记&#xff1a…

解惑1、为何大容量电容滤低频,小容量电容滤高频

一、电容的种类&#xff1a; 链接&#xff1a; 二、疑惑 理论推算&#xff1a; 1&#xff09;Zc1/wc&#xff0c;那么大容量和小容量的电容&#xff0c;不应该都是 越高频越阻抗低&#xff0c;越容易通过&#xff1f; 2&#xff09;大容量&#xff0c;积蓄电荷速度慢&#…

如何有效监控JVM环境,保障应用性能

缓慢的Java应用程序、意外崩溃和晦涩的内存问题——这些都是JVM可能在默默承受压力的信号。JVM监控对于保障Java应用的正常运行时间和最佳性能至关重要&#xff0c;它提供了对Java虚拟机内存、线程和CPU资源使用情况的可见性&#xff0c;使管理员能够在影响终端用户之前识别性能…

python:PyQt5 开发一个邮件客户端,能编写邮件,发送邮件及附件

PyQt5 邮件客户端 下面是一个简洁高效的邮件客户端实现&#xff0c;支持编写邮件、添加附件和发送邮件功能&#xff1a; 编写 eMailClient_qt.py 如下 # -*- coding: utf-8 -*- """ 用 PyQt5 开发一个邮件客户端&#xff0c;能编写邮件&#xff0c;发送邮件及…

React【回顾】 深层次面试详解:函数式组件核心原理与高级优化

以下是对 React 深层次内容的全面解析,涵盖函数式组件的核心原理、性能优化、设计模式和最新特性: 🔧 一、React 核心机制剖析 1. Fiber 架构深解 Fiber 节点结构:function FiberNode(tag, pendingProps, key) {this.tag = tag; // 组件类型(函数组件=0, 类…

视觉语言模型的“视而不见“

这项研究发现&#xff0c;号称能“看图说话”的视觉语言模型&#xff08;VLMs&#xff09;&#xff0c;在处理需要真正“看”懂图片的纯视觉任务&#xff08;如判断深度、找对应点、认物体材质等&#xff09;时&#xff0c;表现远不如它们自己内部的“眼睛”&#xff08;视觉编…

Wyn 商业智能与 3D 大屏的深度融合应用

引言 在当今数字化快速发展的时代&#xff0c;数据可视化对于企业的决策和管理变得至关重要。商业智能软件作为数据可视化的重要工具&#xff0c;能够帮助企业将海量的数据转化为直观、易懂的信息。而 3D 大屏以其沉浸式、立体的展示效果&#xff0c;为数据可视化带来了全新的…

使用docker compose部署netmaker打通内网

准备 我看官网推荐都是使用ssl然后要ssl证书&#xff0c;不想走弯路了 一、docker-compose.yml version: "3.4"services:netmaker:container_name: netmakerimage: gravitl/netmaker:v0.90.0restart: unless-stoppedports:- "18081:18082"- "50051…

Linux集市采购指南[特殊字符]:yum和apt的“抢货”大战!

Linux集市采购指南&#x1f345;&#xff1a;yum和apt的“抢货”大战&#xff01; ✨ 欢迎来到 Linux软件生态集市&#xff01;这里分两大阵营&#xff1a; &#x1f96c; CentOS/RHEL传统菜市场&#xff1a;派稳重的 yum 大叔当采购员&#xff0c;做事一板一眼&#xff1b;✨…

DataX 框架学习笔记

官方仓库&#xff1a; https://github.com/alibaba/DataX?tabreadme-ov-file 1. 介绍 1.1. 基本介绍&#xff1a; DadaX 是阿里云 DataWorks 数据集成 的开源版本&#xff08;异构数据同步、离线数据同步工具 / 平台&#xff09;。主要抽象为 Reader 和 Writer 插件&#…

MaxCompute的Logview分析详解

文章目录 一、Logview简介1、概述2、标题与功能3、基础信息 二、作业详情1、Job Details2、Fuxi Sensor3、Result①当前作业运行成功&#xff0c;显示的为运行结果。②当前作业运行失败&#xff0c;显示的为失败原因。 4、SourceXML5、SQL Script6、History7、SubStatusHistory…

HTML5白云飘飘动态效果教程

HTML5白云飘飘动态效果教程 这里写目录标题 HTML5白云飘飘动态效果教程效果介绍实现步骤步骤一&#xff1a;创建HTML结构步骤二&#xff1a;设计CSS样式步骤三&#xff1a;添加JavaScript交互 代码解析HTML结构解析CSS样式解析JavaScript功能解析 自定义调整总结 效果介绍 本教…

tcp高难度问题

以下是针对这些问题&#xff0c;在面试场景下&#xff0c;既保证理论扎实、逻辑清晰&#xff0c;又具备交流延展性的回答思路与内容&#xff0c;可根据实际面试节奏和面试官反馈灵活调整展开&#xff1a; 1. 客户端端口号如何确定的&#xff1f; 面试官您好&#xff0c;客户端…

广东省省考备考(第二十八天6.13)—资料分析(第二节课)

基期与现期 官方定义&#xff1a;作为对比参照的是基期&#xff0c;而相对于基期比较的是现期 通俗说法&#xff1a;时间靠前的为基期&#xff0c;时间靠后的为现期 增长量与增长率 增长量用来表述基期量与现期量变化的绝对量&#xff1b; 增长率用来表述基期量与现期量变化…