分布式事务seata(AT)与nacos整合-笔记1

本文属于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 支持四种模式:

  1. AT 模式(Automatic Transaction Mode):是 Seata 的默认模式,它通过对业务代码的分布式事务管理进行自动化,通常不需要修改业务代码。它使用 AOP 技术在业务代码执行前后进行拦截,自动产生 undo log 和 confirm log,以此来管理分布式事务。

  2. TCC 模式(Try-Confirm-Cancel):TCC 模式需要为每个分布式事务的业务操作实现 try、confirm 和 cancel 三个操作。在业务代码中显式地调用这些方法来管理分布式事务。

  3. SAGA 模式:SAGA 模式通过编排事务来管理长事务,它将长事务分解为多个短事务,并通过一个 saga 来协调这些事务的执行

  4. XA模式:XA模式是一种分布式事务处理的协议,它使用两阶段提交(2PC)来保证事务的一致性和可靠性。

选择模式时,考虑业务需求和技术栈。如果业务操作支持传统的 ACID 事务,并且不需要编写特殊的回滚逻辑,那么 AT 模式可能是最适合你的。如果你需要对业务逻辑进行细粒度的控制,那么 TCC 模式可能更适合。SAGA 模式适合于管理较为复杂的长事务,用的少。

每种模式的优缺点,官网上列举挺详细的:Seata AT 模式 | Apache Seata

Seata TCC 模式 | Apache Seata

Seata Saga 模式 | Apache Seata

Seata XA 模式 | 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看下服务列表

限于篇幅,先整理到这里,下一篇继续改造工程。

相关推荐
m0_748240547 分钟前
AutoSar架构学习笔记
笔记·学习·架构
siy23332 小时前
[c语言日寄]结构体的使用及其拓展
c语言·开发语言·笔记·学习·算法
雾里看山2 小时前
【MySQL】数据库基础知识
数据库·笔记·mysql·oracle
安和昂2 小时前
effective Objective—C 第三章笔记
java·c语言·笔记
ThisIsClark3 小时前
【gopher的java学习笔记】Java中Mapper与Entity的关系详解
java·笔记·学习
scdifsn3 小时前
动手学深度学习11.6. 动量法-笔记&练习(PyTorch)
pytorch·笔记·深度学习
安冬的码畜日常3 小时前
【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项
笔记·vim·自学笔记·vim多窗口·vim子窗口·vim水平分割·vim垂直分割
m0_548049703 小时前
SpringCloud学习笔记【尚硅谷2024版】
笔记·学习·spring cloud
我是聪明的懒大王懒洋洋3 小时前
dl学习笔记:(7)完整神经网络流程
笔记·神经网络·学习
USER_A0013 小时前
JavaScript笔记进阶篇01——作用域、箭头函数、解构赋值
javascript·笔记