分布式事务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注解分布式事务就完成了。