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

1. 分佈式事務初探

通常來講,目前市面上的數據庫都支持本地事務,也就是在你的應用程序中,在一個數據庫鏈接下的操做,能夠很容易的實現事務的操做。spring

可是目前,基於SOA的思想,大部分項目都採用微服務架構後,就會出現了跨服務間的事務需求,這就稱爲分佈式事務數據庫

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

1.1 什麼是分佈式事務

對於傳統的單體應用而言,實現本地事務能夠依賴Spring的@Transactional註解標識方法,實現事務很是簡單。架構

咱們以最多見的電商系統爲例,簡單拆分爲用戶客戶端、訂單服務、庫存服務、商品服務等等,在用戶下單過程當中,須要同時調用各個服務,可是,每一個服務都是獨立部署的,數據庫鏈接是不共享的,所以要保證這些操做所有執行,或者所有不執行,就須要分佈式事務的支持。app

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官網介紹的特點服務:分佈式

image.png微服務

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

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

2.1 環境準備

運行本測試,須要你提早準備以下的軟件運行環境:性能

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

2.2 Seata管理端

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

sh seata-server.sh 8091 file

觀察8091端口是否啓動。

2.3 數據存儲

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

2.4 構建Spring Boot服務

示例代碼可參考Github倉庫,倉庫的目錄結構以下:

  • 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數據源

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測試,配置測試參數爲:

能夠看到,在addOrder報錯後,會有全局事務的rollback過程。

3. 參考資料

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

以上內容就是關於Spring-Boot基於Dubbo和Seata的分佈式事務解決方案的所有內容了,謝謝你閱讀到了這裏!

相關文章
相關標籤/搜索