前言

之前有记录过分布式下事务一致性问题。总体而言是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。

seata docker 指定ip_spring cloud

maven依赖

同样在官网下:
https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

seata docker 指定ip_docker_02

官方文档

在知道了选择了什么版本之后,我们就要开始看文档了。
官方地址如下:
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 docker 指定ip_分布式_03

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表,用于记录并做数据撤销

seata docker 指定ip_中间件_04

下载镜像

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能力较差,当时这个差点没坑死我

最终图如下:

seata docker 指定ip_docker_05

删除容器

删除容器是为了挂载,映射本机地址和配置文件
docker stop seata-server
docker rm seata-server

配置文件

nacos新建空间

官方是建议新建立一个space的,大概效果图如下:

emmm,忽略上面那个85个配置数,后面有个sh批量处理文件我没弄好,所以传了两次

seata docker 指定ip_中间件_06

修改config.txt

其实配置这么多就够了,官方文档上写了那么多,是因为他们要兼容多个中间件厂商,我们自己选择自己适用的就可以了

seata docker 指定ip_seata docker 指定ip_07

推送配置文件到Nacos

https://github.com/seata/seata/tree/develop/script/config-center/nacos

下载对应的sh文件

seata docker 指定ip_seata docker 指定ip_08

文件存放目录如下:

seata docker 指定ip_seata docker 指定ip_09

在执行命令前,先进入到相关resource目录下
注意权限问题,先chmod一下
sh nacos-config.sh -h xxx.xxx.xxx.xx -p 8848 -g SEATA_GROUP -u nacos -w nacos

修改registry.conf

这里的namespace就是刚刚的那个nacos的那个

seata docker 指定ip_中间件_10

容器挂载启动

配置文件弄完之后,改一下容器的配置文件指向就可以了

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的实例中

seata docker 指定ip_seata docker 指定ip_11

防火墙

对了云服务器不要忘记,开防火墙端口

应用

配置yml

seata docker 指定ip_spring cloud_12

注意这里的tx-service-group: default_tx_group要和nacos上的保持一致

seata docker 指定ip_spring cloud_13

使用

使用十分简单,只需要在方法上加@GlobalTransactional,当然官方文档上有会更多的解释和使用方式
https://seata.io/zh-cn/docs/user/microservice.html

seata docker 指定ip_spring cloud_14


seata docker 指定ip_seata docker 指定ip_15

测试

这个自己测试一下,正常情况下,他会自己做回滚,然后把undoLog里面的数据给删了

如果有问题就会产生这样的一条数据,然后每次服务启动的时候,都会去处理

seata docker 指定ip_seata docker 指定ip_16

一些坑

其实搭建起来还是零零碎碎有很多坑的,
首先就是我一开始docker内seata的容器搭建错误了,主要我自己这块也不是很懂,就一直注册不到nacos上,后来全部删了重新来,就好了

然后就是序列化问题,client.undo.logSerialization要修改为kyro,默认的json序列化有问题

还有数据库日期时间格式要改为timestamp,这个我记得当时看到别人有说,这个改完了,要等到下一个release版本发布

最后我看的别人有这个的错误 @GlobalTransaction 与 @ExceptionHandler冲突