概要

seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现简单等特点。我们能够使用seata 实现分布式事务管理,

是微服务必备的组件。他可以实现在微服务之间的事务管理,也可以实现多个数据源的事务管理。

seata 在阿里内部,和众多的公司都有应用,因此我们可以放心的使用它。

实现的基本原理

SEATA 实现了几种事务模式,我们使用AT模式,他使用起来简单,代码侵入性小。

下图就是AT的事务过程。

TM是事务管理者

RM 资源管理者,可以认为是数据库。

TC 是事务协调者,就是SEATA 服务

TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
XID 在微服务调用链路的上下文中传播。
RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
TM 向 TC 发起针对 XID 的全局提交或回滚决议。
TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

实现方式

配置SEATA

引入相关JAR包

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.1.1.RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>1.2.0</version>
</dependency>

在resources 下增加文件 registry.conf,我的实现为使用nacos作为配置和注册中心

文件内容如下:

registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.31.10:8848"
#namespace = "public"
group = "DEFAULT_GROUP"
#cluster = "default"
#username = "nacos"
#password = "nacos"
}
} config {
type = "nacos"
nacos {
serverAddr = "192.168.31.10:8848"
namespace = ""
group = "SEATA_GROUP"
cluster = "default"
username = "nacos"
password = "nacos"
}
}

第一段是注册中心的配置,第二段为配置中心的配置,配置实际上是放到nacos 下的。

配置文件路径:

https://gitee.com/seata-io/seata/blob/develop/script/config-center/config.txt

可以把这个下下来,然后使用命令将这个配置,提交到 nacos,命令的路径为:

https://gitee.com/seata-io/seata/tree/develop/script/config-center/nacos

我们可以如下执行命令:

nacos-config.sh -h nacos的IP -p nacos端口 -u nacos用户名 -w nacos密码

这个配置需要修改的地方:

service.vgroupMapping.bpm_tx_group=default
service.vgroupMapping.form_tx_group=default
service.vgroupMapping.portal_tx_group=default
service.vgroupMapping.user_tx_group=default
service.vgroupMapping.system_tx_group=default

这个配置 为

service.vgroupMapping + 应用的配置 =default 

这个default 对应上面的配置

事务数据存储到数据库

修改 数据库的配置,我们将配置导入到nacos 。

同时,需要将刚刚的配置文件 registry.conf 拷贝到 seata 目录下

配置好后需要先启动 nacos,在启动 seata

nohup ./seata-server.sh -p 8888 -h 192.168.31.10 &

seata 数据库脚本:

https://gitee.com/seata-io/seata/blob/develop/script/server/db/mysql.sql

这样 事务配置就处理好了。

我们需要在微服务的每个数据库中增加 UNDO_LOG表。

CREATE TABLE IF NOT EXISTS `undo_log`
(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'increment id',
`branch_id` BIGINT(20) NOT NULL COMMENT 'branch transaction id',
`xid` VARCHAR(100) 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 NOT NULL COMMENT 'create datetime',
`log_modified` DATETIME NOT NULL COMMENT 'modify datetime',
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

这个需要和微服务数据库在一起。

代码实现

@Bean("dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
} @Bean("dataSourceProxy")
public DataSourceProxy dataSourceProxy(@Qualifier("dataSource")DataSource dataSource) {
DataSourceProxy proxy=new DataSourceProxy(dataSource);
return proxy;
}

实际上我们在代码中使用的是 DataSourceProxy 代理过的数据源。

测试如下:

在测试时,我们可以发现,通过RootContext  取得Xid。

微服务应用整合SEATA实现分布式事务的更多相关文章

  1. 微服务开发的最大痛点-分布式事务SEATA入门简介

    前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...

  2. Spring Cloud Alibaba 整合 Seata 实现分布式事务

    在Spring Boot单体服务中,添加@Transactional注解就能实现事务.在单体服务中,执行事务都是在同一个数据库下进行.但是随着业务越来越复杂,数据量越来越大会进行分库分表.在微服务场景 ...

  3. Spring Boot微服务如何集成fescar解决分布式事务问题?

    什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最 ...

  4. 带你十天轻松搞定 Go 微服务之大结局(分布式事务)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  5. 微服务痛点-基于Dubbo + Seata的分布式事务(AT)模式

    前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...

  6. 微服务痛点-基于Dubbo + Seata的分布式事务(TCC模式)

    前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...

  7. 115、商城业务---分布式事务---使用Springboot提供的Seata解决分布式事务

    https://seata.io/zh-cn/ seata使用Seata AT模式控制分布式事务的步骤: 1.每一个想控制分布式事务的服务对应的数据库都需要创建一个UNDO_LOG 表 CREATE ...

  8. Spring Boot 集成 Seata 解决分布式事务问题

    seata 简介 Seata 是 阿里巴巴2019年开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务.在 Seata 开源之前,Seata 对应的内部版本在阿里内部一 ...

  9. Spring Cloud Alibaba 使用Seata解决分布式事务

    为什么会产生分布式事务? 随着业务的快速发展,网站系统往往由单体架构逐渐演变为分布式.微服务架构,而对于数据库则由单机数据库架构向分布式数据库架构转变.此时,我们会将一个大的应用系统拆分为多个可以独立 ...

  10. Spring Cloud 微服务技术整合

    微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些 ...

随机推荐

  1. Servlet——xml配置Servlet

    XML配置方式编写 Servlet   步骤:   1.编写 Servlet 类   2.在 web.xml 中配置该Servlet     

  2. DenseFusion复现

    试了一下原版的pytorch1.0.0,可能时间太长了,许多版本都不被支持,没弄成,另找到一个项目适配pytorch1.7.1 租云服务器.配置RTX3090 pytorch1.7 使用termius ...

  3. 音视频入门-8-ffmpeg小实验-v4l2 ubuntu取图、格式转换、编码成H264,ffplay观看

    1. getpic_transform_encode2h264.c #include <stdio.h> #include <string.h> #include <st ...

  4. 课时05:Linux必备系统命令

  5. 将 LLMs 精调至 1.58 比特: 使极端量化变简单

    随着大语言模型 (LLMs) 规模和复杂性的增长,寻找减少它们的计算和能耗的方法已成为一个关键挑战.一种流行的解决方案是量化,其中参数的精度从标准的 16 位浮点 (FP16) 或 32 位浮点 (F ...

  6. 使用ValueConverters扩展实现枚举控制页面的显示

    1.ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换.里面有一些 ...

  7. 浏览器中生成 OSS 令牌 | Web Crypto API

    笔者写文章的时候,都会把图片通过自己搭建的一个简单站点 https://imgbed.sugarat.top/ 把图片上传到各种云的对象存储服务(OSS)上. 然后通过CDN访问,保证图片有可靠的访问 ...

  8. bpftool使用方法简介

    1.安装bpftool工具 看起来,在不同的linux发行版里,bpftool在不同的软件包里,ubuntu 22上,bpftool是linux-tools-generic的一部分,而树莓派里bpft ...

  9. store文件夹的处理,vuex模块化modules

    index文件代码: import Vue from "vue"; import Vuex from "vuex"; // 导入根getters import ...

  10. kotlin更多语言结构——>选择加入要求

    1.3.70 中引入了 @RequireOptIn 与 @OptIn 注解以取代先前使用的 @Experimental 与 @UseExperimental;同时 -Xopt-in 编译器选项也取代了 ...