SpringCloud下Seata的使用(docker)

前言

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N3m88dMv-1655013576326)(evernotecid://4A650CD1-2014-454E-B8C0-1865FE695CD7/appyinxiangcom/17137521/ENResource/p1746)]

注意这里的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冲突

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值