溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于Seata中間件如何分析微服務(wù)模式下事務(wù)管理

發(fā)布時(shí)間:2022-01-14 21:24:31 來(lái)源:億速云 閱讀:135 作者:柒染 欄目:大數(shù)據(jù)

基于Seata中間件如何分析微服務(wù)模式下事務(wù)管理,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

一、Seata簡(jiǎn)介

1、Seata組件

Seata是一款開(kāi)源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata將為用戶提供了AT、TCC、SAGA、XA事務(wù)模式,為用戶打造一站式的分布式解決方案。

2、支持模式

AT 模式

一階段:業(yè)務(wù)數(shù)據(jù)和回滾日志記錄在同一個(gè)本地事務(wù)中提交,釋放本地鎖和連接資源。

二階段:提交異步化,非??焖俚赝瓿??;貪L通過(guò)一階段的回滾日志進(jìn)行反向補(bǔ)償。

TCC模式

一個(gè)分布式的全局事務(wù),整體是兩階段提交的模型,全局事務(wù)是由若干分支事務(wù)組成的,分支事務(wù)要滿足兩階段提交的模型要求,即需要每個(gè)分支事務(wù)都具備自己的:

一階段 prepare 行為

二階段 commit 或 rollback 行為

Saga模式

Saga模式是SEATA提供的長(zhǎng)事務(wù)解決方案,在Saga模式中,業(yè)務(wù)流程中每個(gè)參與者都提交本地事務(wù),當(dāng)出現(xiàn)某一個(gè)參與者失敗則補(bǔ)償前面已經(jīng)成功的參與者,一階段正向服務(wù)和二階段補(bǔ)償服務(wù)都由業(yè)務(wù)開(kāi)發(fā)實(shí)現(xiàn)。

XA模式

XA是一個(gè)分布式事務(wù)協(xié)議,對(duì)業(yè)務(wù)無(wú)侵入的分布式事務(wù)解決方案,XA提交協(xié)議需要事務(wù)參與者的數(shù)據(jù)庫(kù)支持,XA事務(wù)具有強(qiáng)一致性,在兩階段提交的整個(gè)過(guò)程中,一直會(huì)持有資源的鎖,性能不理想的缺點(diǎn)很明顯。

二、服務(wù)端部署

1、下載組件包

1.2版本:seata-server-1.2.0.zip

解壓目錄

  • bin:存放服務(wù)端運(yùn)行啟動(dòng)腳本;

  • lib:存放服務(wù)端依賴的資源jar包;

  • conf:配置文件目錄。

2、修改配置

file.conf配置

mode:db 即使用數(shù)據(jù)庫(kù)存儲(chǔ)事務(wù)信息,這里還可以選擇file存儲(chǔ)方式。

file模式為單機(jī)模式,全局事務(wù)會(huì)話信息內(nèi)存中讀寫(xiě)并持久化本地文件root.data,性能較高;

db模式為高可用模式,全局事務(wù)會(huì)話信息通過(guò)db共享,相應(yīng)性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能較高,存在事務(wù)信息丟失風(fēng)險(xiǎn),請(qǐng)?zhí)崆芭渲煤线m當(dāng)前場(chǎng)景的redis持久化配置.

store {
  ## store mode: file、db
  mode = "db"
  db {
    datasource = "druid"
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata_server"
    user = "root"
    password = "123456"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

registry.conf配置

這里選擇eureka作為注冊(cè)中心,seata-server也要作為一個(gè)服務(wù)添加到注冊(cè)中心,不使用配置中心所以config配置默認(rèn)即可。

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"

  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
}

3、事務(wù)管理表

需要在seata-server即上述配置的MySQL庫(kù)中建立3張事務(wù)管理表:

  • 全局事務(wù):global_table

  • 分支事務(wù):branch_table

  • 全局鎖:lock_table

  • 事務(wù)回滾:undo_log

  • SQL腳本:mysql-script目錄

4、啟動(dòng)命令

Linux環(huán)境:sh seata-server.sh

三、業(yè)務(wù)服務(wù)搭建

1、代碼結(jié)構(gòu)

基于Seata中間件如何分析微服務(wù)模式下事務(wù)管理

  • seata-eureka:注冊(cè)中心

  • seata-order:訂單服務(wù)

  • seata-account:賬戶服務(wù)

  • seata-inventor:庫(kù)存服務(wù)

  • seata-client:客戶端服務(wù)

  • account-feign:賬戶Feign接口

  • inventory-feign:庫(kù)存Feign接口

  • order-feign:訂單Feign接口

請(qǐng)求鏈路:客戶端->訂單->賬戶+庫(kù)存,測(cè)試整個(gè)流程的分布式事務(wù)問(wèn)題。

2、數(shù)據(jù)庫(kù)結(jié)構(gòu)

基于Seata中間件如何分析微服務(wù)模式下事務(wù)管理

  • seata_server:seata組件服務(wù)端依賴庫(kù)

  • seata_account:模擬賬戶數(shù)據(jù)庫(kù)

  • seata_inventor:模擬庫(kù)存數(shù)據(jù)庫(kù)

  • seata_order:模擬訂單數(shù)據(jù)庫(kù)

各個(gè)庫(kù)腳本位置:mysql-script/data-biz.sql

3、啟動(dòng)服務(wù)

依次啟動(dòng):注冊(cè)中心,庫(kù)存服務(wù),賬戶服務(wù),訂單服務(wù),客戶端服務(wù);

Eureka服務(wù)列表如下:

基于Seata中間件如何分析微服務(wù)模式下事務(wù)管理

四、Seata用法詳解

1、Seata基礎(chǔ)配置

基于Seata中間件如何分析微服務(wù)模式下事務(wù)管理

幾個(gè)基礎(chǔ)服務(wù)的配置方式一樣。

conf配置

file.conf重點(diǎn)關(guān)注下面內(nèi)容,事務(wù)組的名稱,需要在yml文件中使用。

my_test_tx_group = "default"

registry.conf:是注冊(cè)中心的選擇。

2、數(shù)據(jù)庫(kù)配置

注意這里的事務(wù)組名稱配置。

spring:
  # 事務(wù)組的名稱
  cloud:
    alibaba:
      seata:
        tx-service-group: my_test_tx_group
  # 數(shù)據(jù)源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata_account
      username: root
      password: 123456

將數(shù)據(jù)庫(kù)整體由Seata進(jìn)行代理管理,核心API:DataSourceProxy。

@Configuration
public class SeataAccountConfig {

    @Value("${spring.application.name}")
    private String applicationName;

    @Bean
    public GlobalTransactionScanner globalTransactionScanner() {
        return new GlobalTransactionScanner(applicationName, "test-tx-group");
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource() ;
    }

    @Primary
    @Bean("dataSource")
    public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:/mapper/*.xml"));
        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
        return sqlSessionFactoryBean.getObject();
    }
}

3、業(yè)務(wù)代碼

核心注解:GlobalTransactional,管理整體的分布式事務(wù)。

@Service
public class OrderServiceImpl implements OrderService {
    private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);

    @Resource
    private OrderMapper orderMapper ;
    @Resource
    private AccountFeign accountFeign ;
    @Resource
    private InventoryFeign inventoryFeign ;

    @GlobalTransactional
    @Override
    public Integer createOrder(String orderNo) {
        LOGGER.info("Order 生成中 "+orderNo);
        // 本服務(wù)下訂單庫(kù)
        Integer insertFlag = orderMapper.insert(orderNo) ;
        // 基于feign接口處理賬戶和庫(kù)存
        accountFeign.updateAccount(10L) ;
        inventoryFeign.updateInventory(10) ;
        return insertFlag ;
    }
}

測(cè)試流程:在任意服務(wù)下拋出異常,觀察整體的事務(wù)狀態(tài),觀察是否有整體的事務(wù)控制效果。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI