分布式事务seata之小试牛刀

简介:基于seata的AT模式在电商业务场景(下单,远程扣库存)下保证数据强一致性,该介绍包括以下内容:seata服务的搭建。

1.环境准备

   centos7

   seata  1.4.0

   spring-boot 版本2.2.2.RELEASE

   springcloud alibaba 版本 2.2.3.RELEASE

   springcloud 版本 Hoxton.SR1 

   nacos版本 根据springcloud alibaba

2.seata的安装与集成

  seata分为服务端与客户端。

  seata保证分布式事务时有TC、TM、RM三个角色;

  TC(事务控制器:属于seata服务侧,用于统一管理分布式的中的多个分支事务

  TM (事务管理器):分布式事务的发起方,可以理解成标注了@GlobalTransaction注解的服务

  RM (分支事务管理器):其他分支事务

 *需要的文件 :从以下链接:https://pan.baidu.com/s/1iFyPPZZQ8Cc_LwLdG_Ze3Q   提取码:02hg

  2.1、在seata下载seata安装包,解压后分为以下文件,阿里系的分布式事务组件都封装成了一个独立的应用(比如nacos、sentinal)

  

2.2、因为seata服务侧启动后需要注册到naco,配置也需要从nacos上获取,所以需要先将seata的配置导入到nacos配置中心(导入前先在nacos上先建立seata-server的命令控件,用于独立存放seata的的配置)

   导入方法:

   说明:

   下载的文件中  nacos-config.sh 是导入脚本,  nacos-config.txt 是需要的导入的配置项

   因为我是同时下载了seata的win 和 centos版本,所以导入配置是在windows上的导入的,但是seata服务是使用的seata-server-1.4.0.tar.gz运行在centos上

   如果需要在centos上导入应该只需要在conf目录下执行nacos-config.sh就可以了(原因:因为nacos-config.sh原理就是模拟POST请求,调用nacos的新增配置的接口,但是要注意的是nacos-config.txt的配置文件要放在和conf同级目录

   windows下的文件目录结构如下:  

     

   windows在git客户端执行以下命令

sh nacos-config.sh -h **.**.**.**  -p 8848 -g SEATA_GROUP -t ef28588f-643e-4466-a0ef-89b47f9e8572 -u nacos -w nacos

  -h  nacos 服务的ip

  -p  nacos的端口

  -t  新建的命名控件seata-server

  -u -w nacos的用户名和密码

  导入成功后的配置如下:

   

 修改nacos配置和seata注册文件配置:

   

 修改registry.conf

 创建seata服务需要的数据库和表

 运行下载文件中的seata-server.sql文件创建global_table,branch_table,lock_table三张数据库表

 启动seata服务:

nohup sh seata-server.sh -p 8091 -h 服务ip &> seata.log &

 至此,seata服务端的配置就完成了,seata服务也可以启动了,接下来是seata的客户端配置。  

 2.3 seata客户端的配置

 默认spring-cloud-starter-alibaba-seata的seata服务版本是0.9, 因为我们安装的seata服务是1.4.0版本,客户端和服务端保持一致(所以要自定义引入seata的版本为1.4.0)

 

  pom文件:

        <!--  引入seata配置      -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--    自定义seata配置    -->
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
        </dependency>

 yaml文件配置:引入1.0.0以上版本的原因是,在1.0.0以上版本seata客户端可以用过yaml文件配置,不用引入registry.conf和file.conf文件,项目看起来优雅点

   

 yaml文件的配置代码:

seata:
  registry:
    nacos:
      application: seata-server
      server-addr: #:8060
      group: SEATA_GROUP

  config:
    nacos:
      namespace: ef28588f-643e-4466-a0ef-89b47f9e8572
      server-addr: #:8060
      group: SEATA_GROUP

  service:
    vgroup-mapping:
      order-tx-group: default
    disable-global-transaction: false
    grouplist:
      default: #:8091
#  enable-auto-data-source-proxy: true
  enabled: false
  tx-service-group: order-tx-group
  enableAutoDataSourceProxy: true
#  use-jdk-proxy: true

注意:seata的AT模式是一种事务的自动补偿机制,通过代理数据源,拦截执行的sql实现

如果代理数据源的配置短横线的方式(enable-auto-data-source-proxy:true)会出现分支事务注册不成功的现象,最好是使用这样配置:enableAutoDataSourceProxy: true

最后,在TM事务上标上@GlobalTransaction注解分布式事务就完成了。

   

原文地址:https://www.cnblogs.com/HubuSugar/p/14876139.html