本文属于b站图灵课堂springcloud笔记系列。讲的好还不要钱,值得推荐。
关于背景知识,二阶段提交等不在此展开。总体思路沿用:为了解决啥问题,是什么,怎么用的快速验证demo去整理。
目的:
就是为了解决分布式事务。单靠spring的事务@Transactional不能解决微服务之间分布式事务(微服务分属于不同的数据源)。
seata是什么?
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
上面来自官网介绍:Seata 是什么? | Apache Seata
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
模式选择:
Seata 支持四种模式:
-
AT 模式(Automatic Transaction Mode):是 Seata 的默认模式,它通过对业务代码的分布式事务管理进行自动化,通常不需要修改业务代码。它使用 AOP 技术在业务代码执行前后进行拦截,自动产生 undo log 和 confirm log,以此来管理分布式事务。
-
TCC 模式(Try-Confirm-Cancel):TCC 模式需要为每个分布式事务的业务操作实现 try、confirm 和 cancel 三个操作。在业务代码中显式地调用这些方法来管理分布式事务。
-
SAGA 模式:SAGA 模式通过编排事务来管理长事务,它将长事务分解为多个短事务,并通过一个 saga 来协调这些事务的执行
-
XA模式:XA模式是一种分布式事务处理的协议,它使用两阶段提交(2PC)来保证事务的一致性和可靠性。
选择模式时,考虑业务需求和技术栈。如果业务操作支持传统的 ACID 事务,并且不需要编写特殊的回滚逻辑,那么 AT 模式可能是最适合你的。如果你需要对业务逻辑进行细粒度的控制,那么 TCC 模式可能更适合。SAGA 模式适合于管理较为复杂的长事务,用的少。
每种模式的优缺点,官网上列举挺详细的:Seata AT 模式 | Apache Seata
不在一一贴出来了。
AT模式工作流程
demo以AT模式为例,对于下单服务来说,要调用库存服务减库存,要调用账户服务减余额。
订单服务要接入TM:
下单要开启全局事务(向TC申请一个全局事务XID),下单正常通知TC提交全局事务,下单异常则通知TC回滚全局事务。
订单、账户、库存要接入RM:
提交本地事务的同事,向TC注册分支事务信息。
接受TC通知,提交或回滚分支事务。
TC:
维护TM提交的全局事务信息跟RM提交的分支事务,接受TM
如何区分是否同一个事务?
开启全局事务回分配一个全局事务XID,seata 使用线程局部存储(ThreadLocal)来传播 XID,确保同一个线程调用链中的所有服务都能获取到同一个 XID。注册分支事务会带上XID。
seata 安装部署
工作流程梳理完了,开启本地seata安装部署。
官方文档:新人文档 | Apache Seata
TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。
版本选择:测试就用了2.0.0
生产环境要慎重评估。
1.X版本较为稳定,2.X新增了raft模式,理论上性能高,成熟度待验证。
TC端事务存储到哪里?
生成环境不考虑file,剩下的还有db跟redis可选。
demo选择db,初始化脚本在
把对应的脚本导入数据库。
TM与RM如何发现TC。demo使用了nacos。
修改seata/conf/application.yml
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace:
group: SEATA_GROUP
data-id: seataServer.properties
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace:
group: SEATA_GROUP
cluster: default
store:
# support: file 、 db 、 redis 、 raft
mode: file
注意,这里namespce与group ,TM,RM要与TC在同一个,不然会找不到server服务。我在这里遇到一个错误。
将seata server的配置文件:seata/script/config-center/config.txt
在nacos 控制台新建dataID为seataServer.properties,内容为上面config.txt同步过来的。这里seataServer.properties要跟前面的seata/conf/application.yml配置对应上,保持一致。
其中这里容易出问题的点:
修改为db模式,并且注意MYSQL 版本区别,8.0驱动与5.0不同。
store.mode=db
store.lock.mode=db
store.session.mode=db
# mysql5.x
#store.db.driverClassName=com.mysql.jdbc.Driver
#store.db.url=jdbc:mysql://tlmall-mysql:3306/seata2.0.0?useUnicode=true&rewriteBatchedStatements=true
# mysql8.x
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://tlmall-mysql:3306/seata2.0.0?useUnicode=true&rewriteBatchedStatements=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true
store.db.user=root
store.db.password=root
额外注意:
service.vgroupMapping.default_tx_group=default
- 事务分组:seata的资源逻辑,可以按微服务的需要,在应用程序(客户端)对自行定义事务分组,每组取一个名字。
- 集群:seata-server服务端一个或多个节点组成的集群cluster。 应用程序(客户端)使用时需要指定事务逻辑分组与Seata服务端集群的映射关系。
初次使用,网上很多这个参数的错误。就是TC要与client保持事物分组一致。
2.0还有个坑,也跟配置有关,我之前整理过:seta2.0 的一个配置问题-CSDN博客
可以先不改试试,如果报错再改。
启动验证:
启动seataserver/bin/脚本。
登录:http://127.0.0.1:7091/#/transaction/list
去nacos看下服务列表
限于篇幅,先整理到这里,下一篇继续改造工程。