分布式事务解决方案之Seata
Seata的概念
Seata是阿里巴巴开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata官网给出的架构示例如下:
Seata Server安装
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 后台管理系统的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表,其它模式不需要)。
- 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: 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:二阶段回滚了事务。
文章评论