SpringCloud+Nacos项目集成Seata分布式事务

news2025/2/25 9:53:18

上一篇: 《 Seata-分布式事务介绍 》: 简单介绍了分布式事务的实现方式,以及详细讲述了Seata-AT模式的两阶段提交步骤流程。

完整示例项目代码地址: https://gitee.com/cnyunze/yz-seata.git

Seata快速上手

  • 安装教程
    • Seata Server(TC端)简介
    • Seata部署
      • 1. 下载安装包
      • 2. 创建seata服务端数据库表
      • 3. 注册中心
      • 4. 配置中心
      • 5. 启动seata
    • 事务分组与高可用
  • 项目集成
    • 1. 环境准备
    • 2. 微服务均引入seata依赖
    • 3. AT模式--创建undo_log日志表
    • 4. 微服务配置application.yml添加seata相关配置信息
    • 5. 在代码里添加全局事务
    • 6. 测试验证分布式事务是否生效

安装教程

组件版本关系

组件版本
JDK1.8.0_333
Spring Boot2.6.13
Spring Cloud2021.0.5
Spring Cloud Alibaba2021.0.5.0
Nacos2.1.2
Seata1.6.1
MySQL8.0.33

其他版本依赖关系可以参考阿里的wiki文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

上文 《Seata-分布式事务介绍 》里有提到,Seata分 TC、TM 和 RM 三个角色,其中TC(Server端)为单独服务端部署,TM 和 RM(Client端)由业务系统集成。

Seata Server(TC端)简介

Seata的server端的数据存储模式现在支持三种:filedbredis

  • **file:**适用单机模式,不支持集群高可用(HA),全局事务会话信息在内存中读写并会持久化到本地文件,性能较高。
  • **db:**支持高可用集群模式(HA),全局事务会话信息通过数据库进行共享,但是相对性能会差一些。
  • **redis:**支持高可用集群模式(HA),但是由于redis的数据持久化机制,会存在事务信息丢失的风险。

本文使用db模式,相关脚本地址:https://github.com/seata/seata/tree/1.6.1/script

client目录里面放的是业务系统集成所需的脚本(例如AT模式所需要的 undo_log 日志表)。

config-center目录里面放的是各类配置中心所需要导入的配置参数信息,其中 config.txt 文件里包含了server端和client端的通用参数信息。

server目录里面为server端也就是 TC 所需的数据库建表脚本,及各个容器的配置。

image-20231203213436648

Seata部署

采用db存储模式 + Nacos(注册中心&配置中心)方式部署Seata服务端。

1. 下载安装包

下载地址:https://github.com/seata/seata/releases

windows系统下载zip的包,linux系统下载tar.gz的包。

image-20231203215255520

2. 创建seata服务端数据库表

创建seata服务端所需数据库,并执行脚本,sql脚本地址:https://github.com/seata/seata/blob/1.6.1/script/server/db/mysql.sql

image-20231203215651832

3. 注册中心

什么是注册中心?注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用.比如Seata Client端(TM,RM),发现Seata Server(TC)集群的地址,彼此通信。

nacos注册中心

​ 在配置Seata注册到nacos的注册中心之前,请先确保已经启动了Nacos服务。(Nacos的基本使用可参考Nacos 快速入门)

调整Seata Server的application.yml配置文件,使seata注册到指定的nacos(127.0.0.1:8848),指定的命名空间(namespace为空的时候,默认注册到public空间里),指定的分组(SEATA_GROUP),加入到指定的cluster集群(guangzhou)。

image-20231203220844190

seata:
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      namespace: ""
      cluster: guangzhou
      username: nacos
      password: nacos

Tips:请确保此处的server端服务与下文的client端服务是注册在同一个namespace和group,不然会找不到服务。

4. 配置中心

什么是配置中心?配置中心可以说是一个"大货仓",内部放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息。

nacos配置中心

​ 调整Seata Server的application.yml配置文件,使seata到指定的nacos(127.0.0.1:8848),指定的命名空间(f0357fda-3e2d-42ae-ac6f-3848aaecf0db),指定的分组(SEATA_GROUP),去读取指定的配置文件(seataServer.properties)。

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
      namespace: f0357fda-3e2d-42ae-ac6f-3848aaecf0db
      dataId: seataServer.properties
      username: nacos
      password: nacos

image-20231203234129964

其中 seataServer.properties 的配置内容为\seata-server-1.6.1\script\config-center\config.txt文件的配置信息,全文复制然后修改几个关键配置即可。

nacos里调整 seataServer.properties 配置里的如下几个关键信息

#Transaction routing rules configuration, only for the client
#service.vgroupMapping.default_tx_group=default
service.vgroupMapping.t_mall_tx_group=guangzhou

#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db

#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata1.6.1?useUnicode=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
store.db.user=seata
store.db.password=seata

Tips:(注意:store.db.driverClassName)

注意上述配置里的 store.db.driverClassName 如果是mysql8,则一定要改为 com.mysql.cj.jdbc.Driver,默认的 com.mysql.jdbc.Driver 会导致在启动seata server启动时提示数据库连接获取失败。mysql5没有进行测试,可以自行验证一下。

(数据库驱动放在目录:\seata-server-1.6.1\lib\jdbc)

Tips:(注意:store.db.url)

当seata使用db模式时,seata是通过jdbc的executeBatch来批量插入全局锁,所以连接参数store.db.url中的 rewriteBatchedStatements 为true时,可在批量插入使,性能提升10倍有余。(在执行executeBatch,并且操作类型 为insert时,jdbc驱动会把对应的SQL优化成insert into () values (),()的形式来提升批量插入的性能)

重点注意(这一块如果暂时不理解,可与先跟着文档配,等项目跑来之后,可以自己再一点点去调整、去验证、然后理解这个配置的用途)

Tips:(重点注意:service.vgroupMapping.t_mall_tx_group)

seata.service.vgroup-mapping.事务分组名=集群名称

其中"集群名称"需要和Seata Server注册到nacos的cluster配置 [seata.registry.nacos.cluster](#3. 注册中心) 以及下文中client端里配置seata.service.vgroup-mapping.t_mall_tx_group(事务分组名)保持一致。

事务分组名称需要和下文的应用程序里集成seata的client端里配置的 seata.tx-service-group([跳转查看](#4. 微服务配置application.yml添加seata相关配置信息)) 保持一致。

5. 启动seata

windows系统启动双击seata-server.bat脚本即可;

linux系统启动使用seata-server.sh脚本,启动命令:

./seata-server.sh

image-20231204231318048

启动之后可以到 nacos 上看到注册的seata服务

image-20231204231612562

image-20231204231642593

其中分组 SEATA_GROUP 对应seata服务的application.yml配置文件里 seata.registry.nacos.group 配置;

集群 guangzhou 对应seata服务的application.yml配置文件里 seata.registry.nacos.cluster 配置;

事务分组与高可用

官方文档:http://seata.io/zh-cn/docs/v1.6/user/txgroup/transaction-group-and-ha

项目集成

完整代码示例地址:https://gitee.com/cnyunze/yz-seata.git

1. 环境准备

现有一个项目yz-seata,项目下有3个微服务:

yz-seata-mall-account:用户账号管理服务,负责记录账户余额;

yz-seata-mall-order:订单管理服务,负责记录用户购买商品记录信息;

yz-seata-mall-storage:库存管理服务,负责记录各商品的剩余库存量;

2. 微服务均引入seata依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

3. AT模式–创建undo_log日志表

各微服务所对应的数据库里都需要添加一个undo_log日志表,该表用于事务数据回滚;

脚本地址:https://github.com/seata/seata/blob/1.6.1/script/client/at/db/mysql.sql

```sql
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
```

image-20231205000028280

4. 微服务配置application.yml添加seata相关配置信息

seata:
  application-id: ${spring.application.name}
  # seata 服务分组,要与服务端配置service.vgroup_mapping的后缀对应
  tx-service-group: t_mall_tx_group
  service:
    vgroup-mapping:
      t_mall_tx_group: guangzhou
  registry:
    type: nacos
    nacos:
      application: seata-server
      group: SEATA_GROUP
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace: f0357fda-3e2d-42ae-ac6f-3848aaecf0db
      group: SEATA_GROUP
      data-id: seataServer.properties

注意:

seata.tx-service-group 要与上文的服务端配置 service.vgroup_mapping (跳转查看 )的后缀对应。

seata.service.vgroup-mapping.事务分组名=集群名称 也要与上文 seataServer.properties 配置文件里的 service.vgroupMapping.t_mall_tx_group=guangzhou 保持一致。

5. 在代码里添加全局事务

在全局事务发起者方法上面添加@GlobalTransactional全局事务注解。

全局事务发起者:判断方法为,是谁最先去调用其他微服务接口的方法,就是全局事务的发起者;

例1:用户下了个订单,先请求订单服务,新增订单方法,然后新增订单方法里又去调用库存服务的扣减库存方法、用户账号服务的扣减余额方法,则新增订单方法就是全局事务的发起者;

例2:用户下了个订单,先扣减用户账号的余额,扣减余额方法又去调库存服务的扣减库存方法、订单服务的新增订单方法,则用户账号服务的扣减余额方法就是全局事务的发起者;

例:

	/**
     * 单纯使用@Transactional注解存在如下问题:
     * 如果订单新增成功,库存扣减成功,但扣减余额的时候失败了,则扣减的余额会回滚,新增的订单信息会回滚,但是已经扣减的库存却不会再回滚
     */
	@GlobalTransactional(name = "addOrder", rollbackFor = Exception.class)
    @Override
    public TOrder saveOrder(TOrder tOrder) {
        tOrder.setId(IdUtil.getSnowflakeNextId());

        // 新增订单信息
        baseMapper.insert(tOrder);

        // 扣减库存
        stockFeignService.deduct(tOrder.getProductId(), tOrder.getNum());

        // 扣减余额
        accountFeignService.deduct(tOrder.getAccountId(), tOrder.getAmount());

        return tOrder;
    }

6. 测试验证分布式事务是否生效

场景1:正常下单–>扣减库存–>扣减余额–>事务成功提交

场景2:正常下单–>扣减库存–>扣减余额(失败)–>验证事务是否回滚(扣减的库存是否有还原)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1285693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

quickapp_快应用_titleBar

titleBar 问题1-titleBar背景设置不支持渐变色问题2- 状态栏背景颜色设置不支持渐变问题3-titleBar的标题不支持居中 如上图所示红色区域就是titleBar&#xff0c;我们可以通过manifest.display设置titleBar的文本、文本颜色、背景色 "display": {"titleBar&qu…

Python 模块--详细整理

Python 模块 在开发过程中&#xff0c;我们写的代码越来越多&#xff0c;如果把它们都写在一个文件中&#xff0c;就会变得越来越长&#xff0c;也越来越难以维护。 后来我们学习了函数&#xff0c;它可以将一段重复使用的代码封装到一个函数中&#xff0c;这样我们就可以轻松地…

NSS [NSSCTF 2022 Spring Recruit]babyphp

NSS [NSSCTF 2022 Spring Recruit]babyphp 考点&#xff1a;PHP特性 开局源码直接裸奔 <?php highlight_file(__FILE__); include_once(flag.php);if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){if(isset($_POST[b1])&&…

视频剪辑方法:AI智剪高效稳定,视频批量处理有技巧

随着社交媒体的兴起和视频制作工具的普及&#xff0c;视频剪辑已经成为一项重要的工作。然而对于许多非专业创作者来说&#xff0c;视频剪辑可能是一项困难的任务。所幸AI智剪提供了一种高效稳定的视频剪辑方法&#xff0c;使得视频批量处理变得更加简单。使用AI智剪可以大大节…

腾讯云轻量应用服务器怎么安装宝塔Linux面板?

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

express中配置swagger并配置token信息

express中配置swagger并配置token信息 1. 安装swagger-jsdoc cnpm install swagger-jsdoc1.3.0 --save2. 在项目根目录下的config目录下新建swagger.js文件并添加配置项 // 引入swagger const swaggerJSDoc require(swagger-jsdoc) // swagger定义 const swaggerDefinitio…

代码签名的工作原理

代码签名的基础是PKI安全体系。代码签名证书由签名证书私钥和公钥证书两部分组成。私钥用于代码的签名&#xff0c;公钥用于私钥签名的验证和证书持有者的身份识别。 1. 发布者从CA机构&#xff08;如JoySSL&#xff09;申请数字证书&#xff1b; 2. 发布者开发出代码&#x…

深入浅出理解kafka ---- 万字总结

1.Kafka简介 Kafka 本质上是一个 MQ&#xff08;Message Queue&#xff09;&#xff0c;使用消息队列的优点&#xff1a; 解耦&#xff1a;允许独立的扩展或修改队列两边的处理过程。可恢复性&#xff1a;即使一个处理消息的进程挂掉&#xff0c;加入队列中的消息仍然可以在系…

300之内的开放式耳机哪款好?超高人气的平价开放式耳机推荐

开放式耳机以其宽广的音场和逼真的音质逐渐成为耳机爱好者们追逐的焦点&#xff0c;在众多选择中&#xff0c;寻找一款既在性能上出众又价格亲民的开放式耳机可谓是一项挑战&#xff0c;为了帮助大家在300之内找到超高人气好用的平价开放式耳机&#xff0c;我们精心筛选了几款备…

山西电力市场日前价格预测【2023-12-05】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-05&#xff09;山西电力市场全天平均日前电价为118.23元/MWh。其中&#xff0c;最高日前电价为305.71元/MWh&#xff0c;预计出现在00:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

自定义TypeHandler 将mysql返回的逗号分隔的String转换到List

sql执行如下&#xff1a; 这里我定义的接受类&#xff1a; 但是这里报了错JSON parse error: Cannot deserialize value of type java.util.ArrayList<java.lang.String>from Object value (token JsonToken.START_OBJECT); nested exception is com.fasterxml.jackson…

MySQL limit导致索引选择(选择的并不是最佳索引)案例分析

mysql limit导致索引选择&#xff08;选择的并不是最佳索引&#xff09;案例分析&#xff1a; 这种情况可能是mysql优化器内部bug造成&#xff1a; bug 触发条件如下: 1.优化器先选择了 where 条件中字段的索引&#xff0c;该索引过滤性较好&#xff1b; 2.SQL 中必须有 orde…

基于vue+node.js智慧校园学生办证系统

基于vuenode.js智慧校园学生办证系统 摘要&#xff1a;随着计算机技术和网络技术的飞快发展&#xff0c;它加速了国内信息化建设的进程&#xff0c;信息技术对管理改革产生了深远的影响。为了适应新时代的发展趋势&#xff0c;各行各业都高度重视信息化建设。在教育领域&#…

优雅草蜻蜓I即时通讯·水银版私有化部署之java服务端搭建教程-01

目录 前言1 1 安装 mongodb2 2 安装 redis3 3. 安装jdk3 4 解压 spring-boot-imapi3 5.开始安装 消息队列组件 rocket4 6. 安装推送服务5 7. 安装 message-push5 8. 安装uplooad 服务5 9&#xff1a; 安装nginx 服务7 1.不需要SSL7 2.需要SSL7 五&#xff1a;编译…

【面试】测试/测开(ING)

63. APP端特有的测试 64. 服务异常情况验证 65. 用什么做性能测试 66. Jmeter如何设计测试场景 67. 压测怎么做 69. UI自动化元素定位方法 参考&#xff1a;UI自动化元素定位 70. gpu和cpu有什么区别 71. gpu性能收哪些因素的影响 72. 共享内存&#xff0c;线程安全吗…

学习pytorch17 pytorch模型保存及加载

pytorch模型保存及加载 代码 import torch import torchvisionvgg16 torchvision.models.vgg16(pretrainedFalse)# 1. save model 1 保存模型结构及模型参数 torch.save(vgg16, ./vgg16_save1.model)# 2. save model 2 只保存模型参数 比第一种保存方法保存的文件要小 t…

整数和浮点数在内存中的存储​(大小端详解)

目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1为什么有大小端?​ 2.2请简述大端字节序和小端字节序的概念&#xff0c;设计一个小程序来判断当前机器的字节序。&#xff08;10分&#xff09;-百度笔试题 方法一&#xff08;char*强制类型转换&#xff09…

【langchain实战】开源项目-RasaGpt

1、概述 RasaGpt是一个建立在 Rasa 和 Langchain 之上的没有显示界面的LMM聊天机器人平台。它是一个Rasa和Telegram这种利用像Langchain这样的LMM库进行索引、检索和上下文注入的样板及参考实现。 开源地址&#xff1a; GitHub - paulpierre/RasaGPT: &#x1f4ac; RasaGPT is…

石原子科技荣登「2024 中国企业服务云图」,引领数据价值在线化革命,助力企业省心省钱更安全

近日&#xff0c;2023 年中国 SaaS 大会在美丽的苏州太湖隆重召开。本次大会由吴中区人民政府、苏州市工信局指导&#xff0c;崔牛会主办&#xff0c;苏州太湖国家旅游度假区管委会协办。会上&#xff0c;知名B2B企业服务平台崔牛会联合火山引擎正式发布了「2024 中国企业服务云…

JS浮点数精度问题及解决方案

前端面试大全JS浮点数精度问题及解决方案 &#x1f31f;经典真题 &#x1f31f;浮点数精度常见问题 &#x1f31f;为什么会有这样的问题 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 为什么 console.log(0.20.10.3) 得到的值为 false &#x1f31f;…