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
繁體地址,請注明出處:http://hk.pswp.cn/news/909478.shtml
英文地址,請注明出處:http://en.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; 增長率用來表述基期量與現期量變化…