Spring Cloud同步場景分散式事務怎樣做?試試Seata
一、概述
在微服務架構下,雖然我們會盡量避免分散式事務,但是隻要業務複雜的情況下這是一個繞不開的問題,如何保證業務資料一致性呢?本文主要介紹同步場景下使用Seata
的AT模式
來解決一致性問題。
Seata
是 阿里巴巴 開源的 一站式分散式事務解決方案 中介軟體,以 高效 並且對業務 0 侵入 的方式,解決 微服務 場景下面臨的分散式事務問題
二、Seata介紹
整體事務邏輯是基於 兩階段提交 的模型,核心概念包括以下3個角色:
- TM:事務的發起者。用來告訴 TC,全域性事務的開始,提交,回滾。
- RM:具體的事務資源,每一個 RM 都會作為一個分支事務註冊在 TC。
- TC:事務的協調者seata-server,用於接收我們的事務的註冊,提交和回滾。
目前的Seata
有兩種模式可使用分別對應不同業務場景
2.1. AT模式
該模式適合的場景:
- 基於支援本地
ACID
事務的關係型資料庫。 - Java 應用,通過
JDBC
訪問資料庫。
一個典型的分散式事務過程:
TM
向TC
申請開啟一個全域性事務,全域性事務建立成功並生成一個全域性唯一的XID
。XID
在微服務呼叫鏈路的上下文中傳播。RM
向TC
註冊分支事務,將其納入 XID 對應全域性事務的管轄。TM
向TC
發起針對XID
的全域性提交或回滾決議。TC
排程XID
下管轄的全部分支事務完成提交或回滾請求。
2.2. MT模式
該模式邏輯類似TCC
,需要 自定義實現 prepare
、commit
和rollback
的邏輯,適合 非關係型資料庫 的場景
三、Seata場景樣例
模擬一個簡單的使用者下單場景,4個子工程分別是 Bussiness(事務發起者)、Order(建立訂單)、Storage(扣減庫存) 和 Account(扣減賬戶餘額)
3.1. 部署Seata的Server端
Discover
註冊、Config
配置和Store
儲存模組預設都是使用file
只能適用於單機,我們安裝的時候分別改成使用nacos
和Mysql
以支援server端叢集
3.1.1. 下載最新版本並解壓
https://github.com/seata/seata/releases
3.1.2. 修改 conf/registry.conf 配置
註冊中心和配置中心預設是file
這裡改為nacos
;設定 registry 和 config 節點中的type
為nacos
,修改serverAddr
為你的nacos
節點地址。
registry {
type = "nacos"
nacos {
serverAddr = "192.168.28.130"
namespace = "public"
cluster = "default"
}
}
config {
type = "nacos"
nacos {
serverAddr = "192.168.28.130"
namespace = "public"
cluster = "default"
}
}
3.1.3. 修改 conf/nacos-config.txt配置
修改 service.vgroup_mapping 為自己應用對應的名稱;如果有多個服務,新增相應的配置
預設組名為
${spring.application.name}-fescar-service-group
,可通過spring.cloud.alibaba.seata.tx-service-group
配置修改修改 store.mode 為
db
,並修改資料庫相關配置
3.1.4. 初始化seata的nacos配置
cd conf
sh nacos-config.sh 192.168.28.130
成功後在nacos
的配置列表中能看到seata
的相關配置
3.1.5. 初始化資料庫
執行conf/db_store.sql
中的指令碼
3.1.6. 啟動seata-server
sh bin/seata-server.sh -p 8091 -h 192.168.28.130
3.2. 應用配置
3.2.1. 初始化資料庫
執行指令碼 seata-demo.sql
需在業務相關的資料庫中新增 undo_log 表,用於儲存需要回滾的資料
3.2.2. 新增registry.conf配置
直接把 seata-server 中的registry.conf
複製到每個服務中去即可,不需要修改
3.2.3. 修改配置
demo中的每個服務各自修改配置檔案
- bootstrap.yml 修改nacos地址
- application.yml 修改資料庫配置
3.2.4. 配置資料來源代理
Seata
是通過代理資料來源實現分散式事務,所以需要配置io.seata.rm.datasource.DataSourceProxy
的Bean
,且是@Primary
預設的資料來源,否則事務不會回滾,無法實現分散式事務
public class DataSourceProxyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean
public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
因為使用了mybatis的starter所以需要排除DataSourceAutoConfiguration
,不然會產生迴圈依賴
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
3.2.5. 事務發起者新增全域性事務註解
事務發起者 business-service
新增 @GlobalTransactional
註解
@GlobalTransactional
public void placeOrder(String userId) {
......
}
3.3. 測試
提供兩個介面測試
- 事務成功:扣除庫存成功 > 建立訂單成功 > 扣減賬戶餘額成功
http://localhost:9090/placeOrder - 事務失敗:扣除庫存成功 > 建立訂單成功 > 扣減賬戶餘額失敗,事務回滾
http://localhost:9090/placeOrderFallBack
3.4. demo下載地址
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-demo/seata-demo
推薦閱讀
- 日誌排查問題困難?分散式日誌鏈路跟蹤來幫你
- zuul整合Sentinel最新的閘道器流控元件
- 阿里註冊中心Nacos生產部署方案
- Spring Boot自定義配置項在IDE裡面實現自動提示
- Spring Cloud Zuul的動態路由怎樣做?整合Nacos實現很簡單
- Spring Cloud開發人員如何解決服務衝突和例項亂竄?
掃碼關注有驚喜!
相關推薦
Spring Cloud同步場景分散式事務怎樣做?試試Seata
一、概述 在微服務架構下,雖然我們會盡量避免分散式事務,但是隻要業務複雜的情況下這是一個繞不開的問題,如何保證業務資料一致性呢?本文主要介紹同步場景下使用Seata的AT模式來解決一致性問題。 Seata是 阿里巴巴 開源的 一站式分散式事務解決方案 中介軟體,以 高效 並且對業務 0 侵入 的方式,解
Spring Cloud非同步場景分散式事務怎樣做?試試RocketMQ
一、背景 在微服務架構中,我們常常使用非同步化的手段來提升系統的 吞吐量 和 解耦 上下游,而構建非同步架構最常用的手段就是使用 訊息佇列(MQ),那非同步架構怎樣才能實現資料一致性呢?本文主要介紹如何使用RocketMQ的事務訊息來解決一致性問題。 RocketMQ 是阿里巴巴開源的分散式訊息中介軟體
Java架構-(三)spring cloud微服務分散式雲架構 - Spring Cloud整合專案簡介
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spring Cloud C
Java架構-(二)spring cloud微服務分散式雲架構 - 整合企業架構的技術點
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js、Spring T
Java架構-(一)spring cloud微服務分散式雲架構 - Spring Cloud簡介
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring C
Spring+JTA+Atomikos+mybatis分散式事務管理
背景描述:我們平時的工作中用到的Spring事務管理是管理一個數據源的。但是如果對多個數據源進行事務管理該怎麼辦呢?我們可以用JTA和Atomikos結合Spring來實現一個分散式事務管理的功能。 事務(官方解釋):是由一組sql語句組成的“邏輯處理單元”。 事務具有
(二)spring cloud微服務分散式雲架構-整合企業架構的技術點
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js、Spring T
(一)spring cloud微服務分散式雲架構-Spring Cloud簡介
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud將目
基於spring-cloud-config的分散式git配置更新
首先我們新建一個模組server-config 需要安裝rabbitmq,用於推送配置 https://www.cnblogs.com/ericli-ericli/p/5902270.html 引入依賴: pom.xml <?xml version="1.0" en
Spring Cloud (四): 分散式環境下自動發現配置服務
前一章, 我們的Hello world應用服務,通過配置伺服器Config Server獲取到了我們配置的hello資訊“hello world”. 但自己的配置檔案中必須配置config server的URL(http://localhost:8888), 如果把config server搬到另外一個獨立I
Spring Cloud微服務分散式雲架構-整合專案
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spring Cl
(一)spring cloud微服務分散式雲架構
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Sp
Spring Cloud入門:分散式配置中心(Spring Cloud Config)
文章例項使用的Spring Cloud版本為Finchley.SR1,Spring Boot版本為2.0.4。 1 Spring Cloud Config Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設
spring cloud微服務分散式雲架構
Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分散式系統基礎設施的開發,如服務發現、註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等(這裡只簡單的列了一部分),都可以用Spring Boot的開發風格做到一鍵啟動和部署。Sp
Java架構-(二)spring cloud微服務分散式雲架構
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js
Java架構-(三)spring cloud微服務分散式雲架構
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spr
(二)Spring Cloud實踐:使用Spring Cloud Config實現分散式配置管理
Spring Cloud Config為微服務應用提供了統一的分散式配置管理,將配置檔案放到git上,所有的微服務應用均從git上獲取這些配置檔案。 該種情況下,如果將配置檔案放在第三方提供的版本控制器上,需要網路可訪問,另外,也可以自己搭建gitlab私服,來存放自己的
(二)spring cloud微服務分散式雲架構
spring cloud本身提供的元件就很多,但我們需要按照企業的業務模式來定製企業所需要的通用架構,那我們現在需要考慮使用哪些技術呢? 下面我針對於spring cloud微服務分散式雲架構做了以下技術總結,希望可以幫助到大家: View: H5、Vue.js、Spring Tag、React、angula
(三)spring cloud微服務分散式雲架構
Spring Cloud整合專案有很多,下面我們列舉一下和Spring Cloud相關的優秀專案,我們的企業架構中用到了很多的優秀專案,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須瞭解一下相關專案,希望可以幫助到大家。 Spring Cl
Spring Cloud config搭建分散式配置中心
通常情況下,我們將配置檔案放在各自的服務中,這樣有個缺點,就是每次修改,要重啟服務。如今微服務這麼流行的趨勢下,一個大專案下會有幾十甚至上百上千個微服務組成。這時候就需要一個統一配置管理了。Spring Cloud config 就很好的解決了這一問題。下圖是Config實現