学习记录之Nacos及Seata
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
也是Spring Cloud Alibaba提供的组件
Seata官方文档
https://seata.io/zh-cn/
更多信息可以通过官方文档获取
为什么需要Seata
我们之前学习了单体项目中的事务
使用的技术叫Spring声明式事务
能够保证一个业务中所有对数据库的操作要么都成功,要么都失败,来保证数据库的数据完整性
但是在微服务的项目中,业务逻辑层涉及远程调用,当前模块发生异常,无法操作远程服务器回滚
这时要想让远程调用也支持事务功能,就需要使用分布式事务组件Seata
事务的4个特性:ACID特性
原子性
一致性
隔离性
永久性
Seata保证微服务远程调用业务的原子性
Seata将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata的运行原理(AT模式)

上面结构是比较典型的远程调用结构
如果account操作数据库失败需要让order模块和storage模块撤销(回滚)操作
声明式事务不能完成这个操作
需要使用Seata来解决

Seata构成部分包含
事务协调器TC
事务管理器TM
资源管理器RM
AT模式运行过程
1.事务的发起方(TM)会向事务协调器(TC)申请一个全局事务id,并保存
2.Seata会管理事务中所有相关的参与方的数据源,将数据操作之前和之后的镜像都保存在undo_log表中,这个表是seata组件规定的表,没有它就不能实现效果,依靠它来实现提交(commit)或回滚(roll back)的操作
3.事务的发起方(TM)会连同全局id一起通过远程调用运行资源管理器(RM)中的方法
4.RM接收到全局id,去运行指定方法,并将运行结果的状态发送给TC
5.如果所有分支运行都正常,事务管理器(TM)会通过事务协调器通知所有模块执行数据库操作,真正影响数据库内容,反之如果有任何一个分支模块运行异常,都会通知TC,再由TC通知所有分支将数据库操作回滚,恢复成运行之前的样子
AT模式的运行有一个非常明显的前提条件,这个条件不满足,就无法使用AT模式
这个条件就是事务分支都必须是操作关系型数据库(mysql\MariaDB\Oracle)
但是如果我们在业务过程中有一个节点操作的是Redis或前天非关系型数据库时,就无法使用AT模式
除了AT模式之外还有TCC、SAGA 和 XA 事务模式
TCC模式
简单来说,TCC模式就是自己编写代码完成事务的提交和回滚
TCC模式要求我们在每个参与事务的业务中编写一组共3个方法
(prepare\commit\rollback)
prepare:准备 commit:提交 rollback:回滚
prepare方法是无论事务成功与否都会运行的代码
commit当整体事务运行成功时运行的方法
rollback当整体事务运行失败是运行的方法
优点:虽然代码是自己写的,但是事务整体提交或回滚的机制仍然可用(仍然由TC来调度)
缺点:每个业务都要编写3个方法来对应,代码冗余,而且业务入侵量大
SAGA模式:
SAGA模式的思想是对应每个业务逻辑层编写一个新的类,可以设置指定的业务逻辑层方法发生异常时,运行当新编写的类中的代码
这样编写代码不影响已经编写好的业务逻辑代码
一般用于修改已经编写完成的老代码
缺点是每个事务分支都要编写一个类来回滚业务,
会造成类的数量较多,开发量比较大
XA模式:
支持XA协议的数据库分布式事务,使用比较少
使用Seata
配置Seata,添加seata依赖<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId></dependency><!-- Seata完成分布式事务需要的两个相关依赖(Seata需要下面两个依赖中的资源) --><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId></dependency>
修改application.yml
注意同一个事务必须在同一个tx-service-group中,同时指定相同的seata地址和端口
要想启动Seata非常简单,只要在启动业务的业务逻辑方法上添加专用的注解即可
下载Seata
https://github.com/seata/seata/releases
https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
启动seata
seata也是java开发的,启动方式和nacos很像,它要求配置环境变量中Path属性值有java的bin目录路径
解压后路径不要用中文,不要用空格,也是解压之后的bin目录下

在路径上输入cmd进入dos窗口:
F:\tools\seata\seata-server-1.4.2\bin>seata-server.bat -h 127.0.0.1 -m file
要想启动测试,先启动Nacos,在seata不关闭的前提下:利用knife4j访问business模块,否则无法触发事务效果,business模块是seata事务的起点
在windows系统中运行seata可能出现不稳定的情况,重启seata即可解决
根据是否发生随机异常,来判断seata是否有效:
如果seata启动时发送内存不足的错误,可以参考下面的文章解决:
https://blog.csdn.net/he_lei/article/details/116229467