前言
之前有记录过分布式下事务一致性问题。总体而言是2pc,3pc的阶段提交,柔性事务,base理论,可靠事务,以及TCC等。
然后,其实有一种更加成熟的现有中间件是Seata,本篇主要记录如何初步使用seata
版本选择
在引入任何中间件的时候,都需要看一下引入的版本,比较幸运的是,seata的社区还算比较完善吧,这些基础的都有。(PS:如果一些中间件暂时找不到相关的适配版本,我们只能进入到MavenRepository内进行查询了 https://mvnrepository.com/,一般我会选择最新稳定的版本)
详细地址如下:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
由于我的cloud版本是2021.0.1,这里我选择了1.4.2的seata。
maven依赖
同样在官网下:
https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
官方文档
在知道了选择了什么版本之后,我们就要开始看文档了。
官方地址如下:
https://seata.io/zh-cn/docs/overview/what-is-seata.html
一些专有名词可以了解一下:
TC (Transaction Coordinator) - 事务协调者: 维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器: 定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器: 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
同样的seata也有很多模式,这里有AT,TCC,SAGA和XA,我这里只是用了AT模式
然后其实在我的理解内,Seata分为两个中心,一个注册中心,一个配置中心。这两个中心都是独立于cloud在外的,这个在文档中有描述。所以会有一种情况,你的微服务注册中心用的是Eureka,但是Seata用的是Nacos。但是这个我试过了,确实不影响。
docker部署
Nacos
这里为了图方便,因为他注册中心和配置中心都可以用。还有就是我Nacos没用过,而Eureka在之前的微服务的时候我用过了。
然后对应的版本选择,就是版本选择内的Nacos内,我选择了1.4.2
然后Nacos的docker搭建可以看这个官网地址(这块我搭建起来还是很快的,我一点都没有被卡的印象,相关官方文档,博客,很全面,实在不行照着别人的抄就可以)
https://nacos.io/zh-cn/docs/quick-start-docker.html
配置后效果图如下:
seata
准备工作
官方文档如下
https://seata.io/zh-cn/docs/ops/deploy-by-docker-142.html
创建数据库
https://github.com/seata/seata/tree/develop/script/server/db
你要额外搭建一个seata的数据库,同时在自己的业务库内创建一个undo_log表,用于记录并做数据撤销
下载镜像
docker pull seataio/seata-server:1.4.2
启动容器
docker run --name seata-server -p 8091:8091 -d seataio/seata-server:1.4.2
拷贝容器文件到本地文件夹
mkdir /mnt/docker/seata-server
docker cp seata-server:/seata-server /mnt/docker/seata-server
注意这里如果不是docker内的文件名seata-server 他会给你创建一个子目录,也叫seata-server,本人docker能力较差,当时这个差点没坑死我
最终图如下:
删除容器
删除容器是为了挂载,映射本机地址和配置文件
docker stop seata-server
docker rm seata-server
配置文件
nacos新建空间
官方是建议新建立一个space的,大概效果图如下:
emmm,忽略上面那个85个配置数,后面有个sh批量处理文件我没弄好,所以传了两次
修改config.txt
其实配置这么多就够了,官方文档上写了那么多,是因为他们要兼容多个中间件厂商,我们自己选择自己适用的就可以了
推送配置文件到Nacos
https://github.com/seata/seata/tree/develop/script/config-center/nacos
下载对应的sh文件
文件存放目录如下:
在执行命令前,先进入到相关resource目录下
注意权限问题,先chmod一下
sh nacos-config.sh -h xxx.xxx.xxx.xx -p 8848 -g SEATA_GROUP -u nacos -w nacos
修改registry.conf
这里的namespace就是刚刚的那个nacos的那个
容器挂载启动
配置文件弄完之后,改一下容器的配置文件指向就可以了
docker run -d --restart always --name seata-server -p 8091:8091 -v /mnt/docker/seata-server:/seata-server -e SEATA_IP=xxx.xxx.xxx.xxx -e SEATA_PORT=8091 seataio/seata-server:1.4.2
容器启动后,如果配置没有问题的话,会在nacos的实例中
防火墙
对了云服务器不要忘记,开防火墙端口
应用
配置yml
注意这里的tx-service-group: default_tx_group要和nacos上的保持一致
使用
使用十分简单,只需要在方法上加@GlobalTransactional,当然官方文档上有会更多的解释和使用方式
https://seata.io/zh-cn/docs/user/microservice.html
测试
这个自己测试一下,正常情况下,他会自己做回滚,然后把undoLog里面的数据给删了
如果有问题就会产生这样的一条数据,然后每次服务启动的时候,都会去处理
一些坑
其实搭建起来还是零零碎碎有很多坑的,
首先就是我一开始docker内seata的容器搭建错误了,主要我自己这块也不是很懂,就一直注册不到nacos上,后来全部删了重新来,就好了
然后就是序列化问题,client.undo.logSerialization要修改为kyro,默认的json序列化有问题
还有数据库日期时间格式要改为timestamp,这个我记得当时看到别人有说,这个改完了,要等到下一个release版本发布
最后我看的别人有这个的错误 @GlobalTransaction 与 @ExceptionHandler冲突