分布式事务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看下服务列表

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

相关推荐
一棵开花的树,枝芽无限靠近你5 小时前
【PPTist】历史记录功能
前端·笔记·学习
qq_366740606 小时前
ubuntu+ros新手笔记(一)
linux·笔记·ubuntu
明明真系叻6 小时前
第二十五周机器学习笔记:卷积神经网络复习、动手深度学习—线性回归、感知机
笔记·机器学习·线性回归·1024程序员节
可乐续命!6 小时前
opencv下载安装及VS配置(笔记)
笔记·opencv
web130933203987 小时前
基于python的Selenium webdriver环境搭建(笔记)
笔记·python·selenium
go_bai8 小时前
数据结构开始——时间复杂度和空间复杂度知识点笔记总结
开发语言·数据结构·经验分享·笔记·学习方法
兀.478 小时前
JAVA2笔记第六章
笔记
硝酯蒽唑Ti镓9 小时前
TMS320C55x DSP芯片结构和CPU外围电路
笔记·dsp开发
bohu839 小时前
gateway 微服务的入口-笔记
笔记·微服务·gateway·api网关