1. 程式人生 > >Spring Cloud同步場景分散式事務怎樣做?試試Seata

Spring Cloud同步場景分散式事務怎樣做?試試Seata

一、概述

在微服務架構下,雖然我們會盡量避免分散式事務,但是隻要業務複雜的情況下這是一個繞不開的問題,如何保證業務資料一致性呢?本文主要介紹同步場景下使用SeataAT模式來解決一致性問題。

Seata是 阿里巴巴 開源的 一站式分散式事務解決方案 中介軟體,以 高效 並且對業務 0 侵入 的方式,解決 微服務 場景下面臨的分散式事務問題

 

二、Seata介紹

整體事務邏輯是基於 兩階段提交 的模型,核心概念包括以下3個角色:

  • TM:事務的發起者。用來告訴 TC,全域性事務的開始,提交,回滾。
  • RM:具體的事務資源,每一個 RM 都會作為一個分支事務註冊在 TC。
  • TC:事務的協調者seata-server,用於接收我們的事務的註冊,提交和回滾。

目前的Seata有兩種模式可使用分別對應不同業務場景

2.1. AT模式

該模式適合的場景:

  • 基於支援本地 ACID 事務的關係型資料庫。
  • Java 應用,通過 JDBC 訪問資料庫。

 
一個典型的分散式事務過程:

  1. TMTC 申請開啟一個全域性事務,全域性事務建立成功並生成一個全域性唯一的 XID
  2. XID 在微服務呼叫鏈路的上下文中傳播。
  3. RMTC 註冊分支事務,將其納入 XID 對應全域性事務的管轄。
  4. TMTC 發起針對 XID 的全域性提交或回滾決議。
  5. TC 排程 XID 下管轄的全部分支事務完成提交或回滾請求。

 

2.2. MT模式

該模式邏輯類似TCC,需要 自定義實現 preparecommitrollback的邏輯,適合 非關係型資料庫 的場景

 

三、Seata場景樣例

模擬一個簡單的使用者下單場景,4個子工程分別是 Bussiness(事務發起者)、Order(建立訂單)、Storage(扣減庫存) 和 Account(扣減賬戶餘額)

3.1. 部署Seata的Server端

Discover註冊、Config配置和Store儲存模組預設都是使用file只能適用於單機,我們安裝的時候分別改成使用nacosMysql以支援server端叢集

3.1.1. 下載最新版本並解壓

https://github.com/seata/seata/releases

 

3.1.2. 修改 conf/registry.conf 配置

註冊中心和配置中心預設是file這裡改為nacos;設定 registry 和 config 節點中的typenacos,修改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.DataSourceProxyBean,且是@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. 測試

提供兩個介面測試

  1. 事務成功:扣除庫存成功 > 建立訂單成功 > 扣減賬戶餘額成功
    http://localhost:9090/placeOrder
  2. 事務失敗:扣除庫存成功 > 建立訂單成功 > 扣減賬戶餘額失敗,事務回滾
    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實現