分布式事务解决方案之Seata
Seata的概念
Seata是阿里巴巴开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata官网给出的架构示例如下:
Seata Server安装
Seata官方下载地址
Seata解压后的目录如下:
- conf:配置文件目录,其中有两个配置文件,application.yml和application.example.yml。application.yml是seata的配置文件,application.example.yml是示例配置文件。
- bin:seata的启动目录
- log:seata的日志目录
- lib:seata依赖的jar包
- scripts:seataServer运行需要的数据库表的sql脚本、logstash配置和配置中心相关的脚本
application.yml文件内容如下:
server:port: 7091 #seata 后台管理系统的portspring:application:name: seata-server #seata服务名称logging:config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user: #seata后台用户名和密码username: seatapassword: seata
seata:config: #seata配置中心相关配置#seata支持的注册中心: nacos, consul, apollo, zk, etcd3type: nacos #这里使用nacos作为配置中心nacos:server-addr: 127.0.0.1:8848 #注册中心地址namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084group: testgrtoup1username: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, sofatype: nacosnacos: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 服务的端口,默认是8091security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore: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表,其它模式不需要)。
- seataServer需要的sql脚本,1.7.1版本对应的SQL脚本
- 创建undo_log表,seata的AT模式需要在涉及到分布式事务的每个服务的数据库中创建这张表。
seata 1.7.1版本对应的undo_log sql,其它版本对应的undo_log sql也可以在上面找到。
1、在分布式事务涉及到的服务中引入seata客户端的依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
2、在yml文件中进行seata的配置
seata: #seataS配置,让微服务通过注册中心找到seata服务registry:type: nacosnacos: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-serverdata-source-proxy-mode: AT #Seata默认为AT模式
3、为了演示,搭建了Account、Order、Storage三个服务,三个服务通过OpenFeign进行远程调用。
业务流程:账户扣减金额–>创建订单–>减少库存
Seata的使用非常简单,只需要在业务流程的发起处使用@GlobalTransactional即可。
这里在最后特地使用代码制造了异常。
访问请求后,控制台输出的信息如下:
可以看到分支事务被删除了,undo_log日志中的信息也被删除了,最后PhaseTwo_Rollbacked:二阶段回滚了事务。
参考
- Seata官方快速开始
- Seata AT 模式
- 事务分组专题
- Docker部署Seata与Nacos整合
- spring-cloud-alibaba组件版本对应关系
- 使用 Docker 部署 Seata Server (1.5.0及以上)