分布式事务之Seata使用

本文详细介绍了Seata,阿里巴巴开源的分布式事务解决方案,包括其概念、提供的事务模式、SeataServer的安装与配置,以及如何在Spring项目中集成Seata并演示了AT模式的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式事务解决方案之Seata

Seata的概念

Seata是阿里巴巴开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata官网给出的架构示例如下:

加粗样式

Seata Server安装

Seata官方下载地址

Seata解压后的目录如下:
加粗样式

  1. conf:配置文件目录,其中有两个配置文件,application.yml和application.example.yml。application.yml是seata的配置文件,application.example.yml是示例配置文件。
  2. bin:seata的启动目录
  3. log:seata的日志目录
  4. lib:seata依赖的jar包
  5. scripts:seataServer运行需要的数据库表的sql脚本、logstash配置和配置中心相关的脚本

application.yml文件内容如下:

server:
  port: 7091 #seata 后台管理系统的port

spring:
  application:
    name: seata-server  #seata服务名称

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${log.home:${user.home}/logs/seata}
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash

console:
  user:  #seata后台用户名和密码
    username: seata
    password: seata
seata:
  config:  #seata配置中心相关配置
    #seata支持的注册中心: nacos, consul, apollo, zk, etcd3
    type: nacos #这里使用nacos作为配置中心
    nacos:
      server-addr: 127.0.0.1:8848  #注册中心地址
      namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
      group: testgrtoup1
      username:
      password:
      context-path:
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key:
      #secret-key:
      data-id: seataServer.properties  # 使用nacos配置中心去管理seata的配置
  registry:  #seata注册中心相关配置
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server  #seata服务的名称
      server-addr: 127.0.0.1:8848  #nacos注册中心地址
      group: testgrtoup1    #seata服务所在的分组
      namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084  #seata服务所在的命名空间
      cluster: HZ  #集群名称
      username:    
      password:
      context-path:
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key:
      #secret-key:    
  server:
    service-port: 8091 #seata 服务的端口,默认是8091
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login

Seata Server需要连接数据库(单独给Seata Server创建一个数据库),记录分布式事务的相关信息。Seata Server使用的数据库的配置文件
seataServer.properties内容如下:

# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000

# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

Seata使用

seata使用需要给seataServer创建数据库以及相关的表,同时在客户端对应的服务的数据库中也需要创建undo_log表去记录事务提交前和提交后的数据的信息(AT模式需要undo_log表,其它模式不需要)。

1、在分布式事务涉及到的服务中引入seata客户端的依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

2、在yml文件中进行seata的配置

seata:  #seataS配置,让微服务通过注册中心找到seata服务
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848  #注册中心的地址
      namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084  #命名空间
      group: testgrtoup1   #分组
      application: seata-server  #seata服务的名称
  tx-service-group: seata-demo  #事务分组名称,需要和service.vgroup-mapping的值保持一致
  service:
    vgroup-mapping:  #事务组和Seata-server集群的映射关系
      seata-demo: HZ  #seata-demo是事务分组名 HZ是集群名称,也就是seata-demo这个事务分组对应的是HZ这个集群中的seata-server
  data-source-proxy-mode: AT #Seata默认为AT模式      

3、为了演示,搭建了Account、Order、Storage三个服务,三个服务通过OpenFeign进行远程调用。
业务流程:账户扣减金额–>创建订单–>减少库存

Seata的使用非常简单,只需要在业务流程的发起处使用@GlobalTransactional即可。
这里在最后特地使用代码制造了异常。
在这里插入图片描述

访问请求后,控制台输出的信息如下:
在这里插入图片描述
可以看到分支事务被删除了,undo_log日志中的信息也被删除了,最后PhaseTwo_Rollbacked:二阶段回滚了事务。

参考

  1. Seata官方快速开始
  2. Seata AT 模式
  3. 事务分组专题
  4. Docker部署Seata与Nacos整合
  5. spring-cloud-alibaba组件版本对应关系
  6. 使用 Docker 部署 Seata Server (1.5.0及以上)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值