使用 Seata 能夠解決 Spring Cloud 微服務應用的分布式事務問題。本文通過一個樣例工程介紹如何將基于 Seata 實現分布式事務的 Spring Cloud 應用運行在 GTS 上。
背景信息
GTS SDK 2.9.0 版本開始提供對 Seata 的兼容支持。
樣例簡介
該樣例模擬了一個用戶訂購商品的業務系統,包含 3 個微服務:
- Storage:庫存服務,扣減指定商品的庫存數量。
- Order:訂單服務,根據采購請求生成訂單。
- Account:賬戶服務,從用戶賬戶中扣減金額。
訂購商品的業務流程如下圖所示:
- Business 開啟一個 GTS 管理的全局事務。
- Business 調用 Storage 和 Order。
- Order 調用 Account。
GTS 將保障整個服務調用鏈路上的數據一致性。
步驟一:下載樣例工程
登錄阿里云管理控制臺,樣例工程詳情請參見基于Seata的Spring Cloud應用樣例。
步驟二:構建樣例工程
- 創建一個用于運行樣例的數據庫,執行工程中的
init.sql
腳本,建立相關表。 構建工程。
構建工程依賴 Maven,準備一個可用的 Maven 環境。
在樣例工程的根目錄下,執行
mvn clean install
命令。
SDK 包是由 common/lib 里的
download-maven-plugin
插件通過 wget 命令從 GTS 官網下載的。如果您的環境不能執行 wget 命令,上面的 Maven 構建會失敗。這種情況下,請您按以下方式操作。手工下載最新的 SDK開發包,并放在 common/lib 目錄下。
在工程 pom.xml 文件的
modules
中將common
刪掉。<modules> <!--<module>common</module>--> <module>bussiness</module> <module>account</module> <module>storage</module> <module>order</module> <module>eureka</module> </modules>
重新執行
mvn clean install
命令。
運行成功后
common/lib
目錄下會生成 GTS 的 SDK 包,包括:客戶端主包:~txc-client-${gts.sdk.version}.jar
Spring Cloud 原生支持包:txc-client-springcloud-${gts.sdk.version}.jar
說明需要執行以下命令,來觸發
download-maven-plugin
的wget。mvn clean install
步驟三:導入樣例工程到 IDE
為了方便運行和理解,建議您把工程導入到 IDE 中。
步驟四:運行樣例工程
分別運行樣例工程中 5 個 module 的 Main 方法,啟動服務。
Storage:StorageApplication
Order:OrderApplication
Account:AccountApplication
Business:BusinessApplication
服務啟動成功后,通過瀏覽器訪問 http://127.0.0.1:8084/purchase 來調用訂購業務。
說明可選的調用參數請閱讀樣例中的 BusinessController.java 的代碼來了解。
關鍵配置和運行機制解讀
application.properties 中,seata.txc
前綴的一系列配置是 GTS 關鍵配置,說明如下:
GTS 全局事務調用鏈路上的每個服務都要做這些配置,例如樣例中的Business、Storage、Order和Account。
seata.txc.txcAppName
:為每個服務定義一個全局唯一的名字。seata.txc.txServiceGroup
:GTS 服務實例名。在本地運行通過公網訪問 GTS 服務時,請使用公共的實例 txc_test_public.1129****3855****.QD 并配合使用下面的
seata.txc.servcieEndPoint
配置。在正式環境 ECS 上運行時,請使用您訂購的 GTS 服務實例全名,并配合使用下面的
seata.txc.accessKey
和seata.txc.secretKey
配置。
seata.txc.servcieEndPoint
:公網訪問 GTS 服務的接入地址,固定值 https://test-cs-gts.aliyuncs.com 。這個配置僅在本地公網訪問時需要。seata.txc.accessKey
和seata.txc.secretKey
:在阿里云環境上正式運行,這里配置您GTS服務實例使用者的AK和SK用于鑒權。默認是使用訂購GTS 服務實例的用戶(即實例全名中間部分賬號ID對應用戶)的AK和SK。也可以使用RAM授權的用戶AK和SK,具體方法請參見為 RAM 用戶授權事務分組。