前言
在服務做微服務改造後,原先單庫 查詢已經不能滿足要求,每個拆分的微服務對應一個數據庫例項,而且部署在不同的伺服器上,那麼解決“跨庫查詢”就勢在必行了。
以筆者實戰經歷來看,以下幾個思路僅供參考。
表字段冗餘
想必大家已經很熟悉,幾乎每天都會打交道,不用多講。
需要指出的是
欄位不能太多,建議控制在 2-4 個左右。否則會出現資料更新不一致問題,一旦冗餘欄位有改動,極容易產生髒資料
。
解決思路
建立同步機制,必要時採取人工補償措施。
所以,合理的欄位冗餘是潤滑劑,減少 關聯查詢,讓資料庫執行效能更高更快。
聚合服務封裝查詢
聚合服務
簡單來說,就是把不同服務的資料統一組裝在一個新的服務裡做聚合,對外提供統一入口 介面查詢。
筆者曾經開發新聞報表查詢介面時,需要用到使用者,新聞、使用者標籤、登入記錄等資料。但是使用者、新聞、登入記錄在不同的資料庫,而且還不在同一臺伺服器上。
經筆者分析,把程式碼寫在使用者微服務或者新聞微服務都不合適,最後只能自己單獨寫了一個聚合服務來解決跨查詢資料問題。
聚合服務的資料組裝是以 API 介面呼叫來實現,一般不建議直連資料庫連表查詢。
這樣做的好處是減少服務間呼叫次數以及查詢庫表壓力,在實際的業務開發中,我們經常碰到類似的需求,而聚合服務不失為一種較徹底的服務解耦實現方式。
表檢視查詢
如果涉及到不同資料庫表之間的 查詢,可以在其中某一資料庫的表上建立檢視()關係,這種方式非常高效,只需要開發一個簡單介面對外提供服務就可以了,而且省去聚合服務帶來呼叫、查詢、聚合的複雜性。
前提條件
資料庫需要部署在同一臺伺服器上
資料庫賬戶密碼必須相同,也就是在同一個 下
另外表檢視查詢這種方式,是一種緊耦合的設計方式,不利於程式擴充套件,除非你很確定將來業務變動不大,可以考慮使用。以筆者經驗來看,不適合大規模使用。
多資料來源查詢
這種方式是一種比較技術化的思路,簡單來說就是一個微服務配置多個數據庫源(),進行資料來源來回切換進行庫表查詢,以達到獲取不同資料的目的。
實現思路
利用
利用 的 動態切換資料來源
利用 的依賴注入方式管理 資料來源物件
具體實現方式,網上例子很多很成熟的實現方案。
分庫分表:使用資料庫中介軟體
Sharding-Shpere
想必做過分庫分表的同學對他一定不陌生,其出身來至當當開源專案 。非常優秀的跨庫查詢解決方案,目前在京東內部已經廣泛使用。 創始人張亮已加入京東, 還在不停的迭代,目前更名為 ,已經入Apache頂級專案,進行孵化,非常看好它
高可用架構圖
官網傳送門
shardingsphere
Mycat
一個徹底開源的,面向企業應用開發的大資料庫叢集,支援事務、、可以替代 的加強版資料庫;一個可以視為 叢集的企業級資料庫,用來替代昂貴的 叢集;一個融合記憶體快取技術、 技術、 大資料的新型 ;結合傳統資料庫和新型分散式資料倉庫的新一代企業級資料庫產品;一個新穎的資料庫中介軟體產品。
高可用架構圖
Mycat關鍵特性
遵守 原生協議,跨語言,跨平臺,跨資料庫的通用中介軟體代理。
支援單庫內部任意 ,支援跨庫 表 ,甚至基於 的多表 。
支援透過全域性表, 關係的分片策略,實現了高效的多表 查詢。
從 特性來說,其天生就支援分庫分表以及跨庫查詢,具體不多說,有興趣的同學,可以去官網瞭解 的原理。