1. 程式人生 > 程式設計 >詳解SpringBoot基於Dubbo和Seata的分散式事務解決方案

詳解SpringBoot基於Dubbo和Seata的分散式事務解決方案

1. 分散式事務初探

一般來說,目前市面上的資料庫都支援本地事務,也就是在你的應用程式中,在一個數據庫連線下的操作,可以很容易的實現事務的操作。

但是目前,基於SOA的思想,大部分專案都採用微服務架構後,就會出現了跨服務間的事務需求,這就稱為分散式事務

本文假設你已經瞭解了事務的執行機制,如果你不瞭解事務,那麼我建議先去看下事務相關的文章,再來閱讀本文。

1.1 什麼是分散式事務

對於傳統的單體應用而言,實現本地事務可以依賴Spring的@Transactional註解標識方法,實現事務非常簡單。

我們以最常見的電商系統為例,簡單拆分為使用者客戶端、訂單服務、庫存服務、商品服務等等,在使用者下單過程中,需要同時呼叫各個服務,但是,每個服務都是獨立部署的,資料庫連線是不共享的,因此要保證這些操作全部執行,或者全部不執行,就需要分散式事務

的支援。

1.2 分散式事務解決方案

  • 全域性事務,基於DTP模型實現,需要三種角色即Application 應用系統,Transaction Manager 事務管理器,Resource Manager資源管理器;
  • 基於可靠訊息服務的分散式事務,通過訊息佇列實現事務的一致性;
  • TCC,即Try、Confirm、Cancel,屬於補償型分散式事務,Try:嘗試待執行的事務,Confirm:執行事務,Cancel:取消執行的事務;

1.3 Seata介紹

Seata 是一款開源的分散式事務解決方案,致力於在微服務架構下提供高效能和簡單易用的分散式事務服務。Seata 於2019.1正式對外開源,前身是阿里巴巴2014年誕生的 TXC(Taobao Transaction Constructor)。以下是Seata官網介紹的特色服務:

bc0cc61d25fa4c23826beb44fef8d661

Seata 將為使用者提供了 AT、TCC 和 XA 事務模式,為使用者打造一站式的分散式解決方案。更多關於Seata的介紹,可參考其官網。

2. Spring Boot,Dubbo和Seata實現分散式事務案例

2.1 環境準備

執行本測試,需要你提前準備如下的軟體執行環境:

52184aca8dd6493fb0414f4e93ec4092

本案例,主要模仿簡單的下單扣減庫存的過程,架構圖如下:

5721efd7a2864c55a36258c8e21987d8

2.2 Seata管理端

下載Seata的最新版本,並解壓後,進入seata/bin目錄,啟動:

sh seata-server.sh 8091 file

觀察8091埠是否啟動。

2.3 資料儲存

本測試服務,需要建立兩張表,分別是訂單表和庫存表:

f271d4dda274412ca428a20dd2a0c54a

2.4 構建Spring Boot服務

示例程式碼可參考Github倉庫,倉庫的目錄結構如下:

bbcee56a03a6409a95b9118e5f1c9f93

  • springboot-base:儲存公共呼叫的基類介面,mapper介面,Model層的類等,可mvn install後,供另外三個module呼叫。
  • springboot-dubbo-storage:庫存服務;
  • springboot-dubbo-order:訂單服務;
  • springboot-dubbo-client:RPC消費者,提供對外介面;

基於Spring Boot構建Dubbo服務可參考之前的博文《Spring Boot(五)之整合Dubbo部署RPC服務》,構建本專案的過程就不再贅述了。

加入Seata元件後,與普通Dubbo專案的不同之處在於

1,配置Seata資料來源

28f545991b414a9eb89d77b9f3b81e46

2,Seata初始化

/**
 * 配置全域性事務掃描器。有兩個引數,一個是應用名稱,一個是事務分組
 *
 * @return
 */
@Bean
public GlobalTransactionScanner globalTransactionScanner() {
  return new GlobalTransactionScanner("springboot-dubbo-storage","my_test_tx_group");
}

3,配置註冊中心,目前可用的配置中心有file、nacos 、apollo、zk、consul,file型別本身不具備註冊中心的動態發現和動態配置功能,官方的初衷是在不依賴第三方配置註冊中心的基礎上快速整合測試seata功能。配置內容在file.conf和registry.conf。

4,註解標記事務方法,在需要分散式事務的方法上,加上@GlobalTransactional註解即可。

2.5 測試

依次啟動Seata、springboot-dubbo-storage、springboot-dubbo-order、springboot-dubbo-client後,開啟postman測試,配置測試引數為:

51a43f20c64d4620b7dee1957c4ec9a8

可以看到,在addOrder報錯後,會有全域性事務的rollback過程。

3. 參考資料

  • Seata
  • 如何使用Seata保證Dubbo微服務間的一致性
  • SpringBoot+Dubbo+Seata分散式事務實戰
  • 分散式事務選型的取捨
  • 常用的分散式事務解決方案

到此這篇關於詳解SpringBoot基於Dubbo和Seata的分散式事務解決方案的文章就介紹到這了,更多相關SpringBoot 分散式事務內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!