SpringBoot2.x 集成ShardingSphere+Seata+Mybatis-Plus+DruidDataSource


引言

隨著業(yè)務和數(shù)據(jù)量的增加臭蚁,應用采用微服務部署日益增多簿废,但是絕大多數(shù)微服務架構(gòu)應用也還是采用的單數(shù)據(jù)庫模式为居,即便是大多數(shù)讀寫分離枯途,本質(zhì)也還是單數(shù)據(jù)庫忌怎,隨著業(yè)務量和數(shù)據(jù)量增多,數(shù)據(jù)庫讀寫效率急劇下降酪夷,此時就需要對數(shù)據(jù)庫進行維度拆分榴啸,如水平拆分(分表)、垂直拆分(分庫)

本文討論的情況為水平拆分與垂直拆分晚岭,以及遇到的各種集成問題


版本

ShardingSphere:4.0.0-RC2-SNAPSHOT

Seata:0.5.1

Mybatis-Plus:2.3.1

DruidDataSource:1.1.10

ShardingSphere目前對應Dev未發(fā)布版本


規(guī)則

提前將項目對應sql目錄文件導入數(shù)據(jù)庫鸥印,undo_log表為Seata用于回滾的表

其余t_order_0、t_order_1坦报、t_order_item_0库说、t_order_item_1為ShardingSphere對應的分表,注意:一定要提前創(chuàng)建好分庫分表片择,因為ShardingSphere內(nèi)部是需要提前進行分庫分表掃描并加入ShardingSphere對應的DataSourceMap

簡介

Seata AT 事務模型包含 TM(事務管理器)潜的,RM(資源管理器),TC(事務協(xié)調(diào)器)字管。

TC為seata-server啰挪,可以理解為單獨部署的服務器,TM/RM 通過RPC與TC進行交互

ShardingSphere 分布式事務


ShardingSphere SPI供用戶擴展XA強一致性事務或者是Base柔性事務嘲叔,而Seata AT作為一種Base柔性事務的一種實現(xiàn)亡呵,本文著重分析和使用Seata

整合SeataAT分析過程


從ShardingSphere 官方圖像顯示,Seata與ShardingSphere 框架都是對DataSource 進行封裝和處理硫戈,所以要將Seata事務融入到ShardingSphere 框架中使用锰什,就需要將Seata框架中DataSourceProxy包裝給ShardingSphere 框架的ShardingTransactionManager接口。不好理解丁逝?那咱們通過代碼分析


從上圖可知SeataATShardingTransactionManager實現(xiàn)了ShardingTransactionManager汁胆,這是一個SPI擴展接口,將SeataAT事務融入到ShardingSphere 框架中

通過查看initSeataRPCClient接口可知

對Seata的TM霜幼、RM進行初始化沦泌,以上簡要概述了ShardingSphere 使用SeataAT事務的流程,下面結(jié)合Springboot來具體分析集成各個框架的流程


分析1:ShardingSphere 創(chuàng)建DataSource

在sharding-jdbc-spring-boot-starter工程中SpringBootConfiguration會自動裝配參數(shù)

通過代碼分析辛掠,啟動之后通過遍歷配置的names字段創(chuàng)建DataSource,其中return DataSourceUtil.getDataSource(dataSourceProps.get("type").toString(), dataSourceProps);通過用戶配置的連接池類型進行初始化,因為ShardingSphere默認使用的HikariDataSource萝衩,而項目需要使用DruidDataSource回挽,所以繼續(xù)分析創(chuàng)建DataSource的過程

通過代碼得知,ShardingSphere框架通過反射猩谊,將type字段同級的參數(shù)一并傳入進行反射調(diào)用千劈,所以我們就需要將DruidDataSource所需參數(shù)放置到type字段同級

這樣就完成了使用DruidDataSource?答案是NO牌捷,細心的同學可能會在啟動日志中發(fā)現(xiàn)輸出了Init DruidDataSource墙牌,通過繼續(xù)分析發(fā)現(xiàn)

DruidDataSource自動創(chuàng)建了DataSource,我們的期望是DataSource由ShardingSphere進行創(chuàng)建暗甥,所以我們需要在@SpringBootApplication中排除DruidDataSourceAutoConfigure,至此ShardingSphere創(chuàng)建DataSource的過程完成


分析2:ShardingSphere使用SeataAT事務

通過上訴分析我們已經(jīng)得知ShardingSphere已經(jīng)創(chuàng)建好了各個DataSource并將其放入dataSourceMap集合中喜滨,通過Seata官網(wǎng)可知,需要使用Seata事務撤防,需要使用Seata提供的DataSourceProxy類虽风,繼續(xù)通過源碼分析

ShardingSphere內(nèi)部通過SPI擴展,將ShardingTransactionManager接口暴露寄月,在ShardingSphere創(chuàng)建完DataSource之后辜膝,緊接著通過擴展ShardingTransactionManager接口,將dataSourceMap集合中的各個DataSource代理給DataSourceProxy漾肮,至此SeataAT已經(jīng)融入ShardingSphere,但是現(xiàn)在使用Seata的@GlobalTransactional是無效的厂抖,下文會繼續(xù)分析


分析3:集成Mybatis-Plus/Mybatis

Mybatis-Plus作為Mybatis的一種增強,引入Mybatis-Plus之后并配置參數(shù)

一切看起來是那么的輕松克懊,啟動項目...不出意外將出現(xiàn)以下信息

為什么,為什么忱辅、為什么會這樣.我太難了...

話不多說,繼續(xù)分析原因,因為我們使用Mybatis-Plus保檐,默認會引入Mybatis依賴庫耕蝉,然后DataSourceAutoConfiguration會自動加載,DataSourceAutoConfiguration會查找spring->datasource->url字段夜只,因為我們用的ShardingSphere垒在,并未配置這樣的參數(shù),知道原因了那就繼續(xù)在@SpringBootApplication中排除DataSourceAutoConfiguration

繼續(xù)啟動項目......不出意外出現(xiàn)以下信息

錯誤提示沒有發(fā)現(xiàn)sqlSessionFactory扔亥,因為我們使用Mybatis-Plus场躯,正常情況下因由Mybatis-Plus進行sqlSessionFactory的創(chuàng)建,繼續(xù)查看Mybatis-Plus源碼

打個斷點調(diào)試一波旅挤,發(fā)現(xiàn)確實沒有進入踢关,這又是為什么?查看MybatisPlusAutoConfiguration上面的注解發(fā)現(xiàn)粘茄,因為我們已經(jīng)排除了DataSourceAutoConfiguration了签舞,知道原因了秕脓,就是這個MybatisPlusAutoConfiguration沒生效,怎么辦儒搭?

自己重寫一份MybatisPlusAutoConfiguration到項目里面吧吠架,在SpringBootApplication中直接排除MybatisPlusAutoConfiguration

至此Mybatis-Plus集成完畢


分析4:Seata 注解@GlobalTransactional

在上文中說道ShardingSphere使用SeataAT事務,但是官方例子是Jdbc直連搂鲫,不符合SpringBoot集成特點傍药,所以本段落主要分析和如何使用@GlobalTransactional注解

如果我們使用Seata官方例子不難發(fā)現(xiàn),我們直接使用@GlobalTransactional注解是很方便的魂仍,也無需關(guān)心@GlobalTransactional 內(nèi)部是如何實現(xiàn)的拐辽,但是當我們集成了ShardingSphere之后,我們按照Seata官方例子那樣直接在我們的業(yè)務Service上面使用@GlobalTransactional注解擦酌,會發(fā)現(xiàn)這個注解是無效的俱诸。這又是為什么?查看下源碼

GlobalTransactionScanner實現(xiàn)AbstractAutoProxyCreator仑氛,然后根據(jù)wrapIfNecessary判斷具體的Bean實體是否需要進行Aop包裝/代理/增強,包裝的條件為是否存在GlobalTransactional注解

回過頭我們發(fā)現(xiàn)ShardingSphere封裝的SeataATShardingTransactionManager類只是初始化了TMClient乙埃、RMClient。并沒有對Seata的@GlobalTransactional注解進行處理

知道流程之后我們不難發(fā)現(xiàn)@GlobalTransactional注解的具體攔截實現(xiàn)類是GlobalTransactionalInterceptor锯岖。查看源碼

發(fā)現(xiàn)實現(xiàn)Aop的MethodInterceptor

既然已經(jīng)分析到了這里介袜,那么方法自然而然就有了

方案1:重寫GlobalTransactionScanner類,然后通過@Bean注入,把里面的TMClient出吹、RMClient這些剔除,因為TMClient遇伞、RMClient已經(jīng)在ShardingSphere的SeataATShardingTransactionManager類里面進行初始化了,此方案為最佳推薦方案捶牢,因為GlobalTransactionScanner內(nèi)部做了代理判斷

方案2:直接通過AOP進行處理鸠珠,簡單粗暴,但是如果是線上不推薦該方案,因為沒有GlobalTransactionScanner處理的全面


至此Springboot集成ShardingSphere+Seata+Mybatis-Plus+DruidDataSource完畢秋麸,若有錯誤地方歡迎指出,后續(xù)文章將繼續(xù)分析和使用Nacos渐排、Dubbo


項目地址:https://github.com/huangjian888/jeeweb-mybatis-springboot/tree/v3.0-master/x-micro-service/x-spring-boot-nacos/x-spring-boot-shardingsphere-seata

例子已整合到Seata官方Demo中: https://github.com/seata/seata-samples/tree/master/springboot-shardingsphere-seata

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灸蟆,隨后出現(xiàn)的幾起案子驯耻,更是在濱河造成了極大的恐慌,老刑警劉巖炒考,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可缚,死亡現(xiàn)場離奇詭異,居然都是意外死亡斋枢,警方通過查閱死者的電腦和手機帘靡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤帚,“玉大人描姚,你說我怎么就攤上這事涩赢。” “怎么了轰胁?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵谒主,是天一觀的道長。 經(jīng)常有香客問我赃阀,道長,這世上最難降的妖魔是什么擎颖? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任榛斯,我火速辦了婚禮,結(jié)果婚禮上搂捧,老公的妹妹穿的比我還像新娘驮俗。我一直安慰自己,他們只是感情好允跑,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布王凑。 她就那樣靜靜地躺著,像睡著了一般聋丝。 火紅的嫁衣襯著肌膚如雪索烹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天弱睦,我揣著相機與錄音百姓,去河邊找鬼。 笑死况木,一個胖子當著我的面吹牛垒拢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播火惊,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼求类,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屹耐?” 一聲冷哼從身側(cè)響起尸疆,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎张症,沒想到半個月后仓技,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俗他,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年脖捻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兆衅。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡地沮,死狀恐怖嗜浮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摩疑,我是刑警寧澤危融,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站雷袋,受9級特大地震影響吉殃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楷怒,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一蛋勺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸠删,春花似錦抱完、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烘贴,卻和暖如春禁添,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庙楚。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工上荡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馒闷。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓酪捡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纳账。 傳聞我的和親對象是個殘疾皇子逛薇,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345