Springboot 集成 Seata

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

1.找到适合的Seata版本

参考:SpringCloudAlibaba SpringCloud SpringBoot 版本对照

依赖版本:

spring-boot:2.3.12.RELEASE

spring-cloud-alibaba:2.2.7.RELEASE

spring-cloud:Hoxton.SR12

nacos:2.0.3

seata: 1.3.0

2.下载合适版本的Seata源码下载

Release v1.3.0 · seata/seata · GitHub

wget https://github.com/seata/seata/archive/refs/tags/v1.3.0.zip
wget https://github.com/seata/seata/archive/refs/tags/v1.3.0.tar.gz

3.配置启动Seata

3.1 初始化数据库

3.1.1 创建seata数据库

3.1.2 初始化表

资源链接:https://github.com/seata/seata/blob/1.3.0/script/server/db/mysql.sql

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(`xid`                       VARCHAR(128) NOT NULL,`transaction_id`            BIGINT,`status`                    TINYINT      NOT NULL,`application_id`            VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name`          VARCHAR(128),`timeout`                   INT,`begin_time`                BIGINT,`application_data`          VARCHAR(2000),`gmt_create`                DATETIME,`gmt_modified`              DATETIME,PRIMARY KEY (`xid`),KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(`branch_id`         BIGINT       NOT NULL,`xid`               VARCHAR(128) NOT NULL,`transaction_id`    BIGINT,`resource_group_id` VARCHAR(32),`resource_id`       VARCHAR(256),`branch_type`       VARCHAR(8),`status`            TINYINT,`client_id`         VARCHAR(64),`application_data`  VARCHAR(2000),`gmt_create`        DATETIME(6),`gmt_modified`      DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(`row_key`        VARCHAR(128) NOT NULL,`xid`            VARCHAR(96),`transaction_id` BIGINT,`branch_id`      BIGINT       NOT NULL,`resource_id`    VARCHAR(256),`table_name`     VARCHAR(32),`pk`             VARCHAR(36),`gmt_create`     DATETIME,`gmt_modified`   DATETIME,PRIMARY KEY (`row_key`),KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;

3.2 完善Nacos相关配置

安装配置启动Nacos参考:Linux Nacos 快速启动_nacos linux快速启动-CSDN博客

3.2.1 新建命名空间 seata

3.2.2 修改config.txt

/seata/script/config-center/config.txt

service.vgroupMapping.my_test_tx_group=SEATA_GROUPstore.mode=dbstore.db.url=jdbc:mysql://xxxx:3306/seata?useUnicode=true
store.db.user=seata
store.db.password=xxxx

3.2.3 将配置信息推送至nacos

源码目录下:/seata-1.3.0/script/config-center/nacos/nacos-config.sh

chmod +x nacos-config.sh./nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t 61311143-2318-4af4-9180-ebbc0fxxxxx -u nacos -w nacos

-h: host, 默认值 localhost

-p: port, 默认值 8848

-g: 配置分组 默认值 SEATA_GROUP

-t: 命名空间

-u: 用户名, nacos 1.2.0+ 之后添加权限验证 默认为''

-w: 密码, nacos 1.2.0+ 之后添加权限验证 默认为''

 

4. 配置启动Seata服务

wget https://github.com/seata/seata/releases/download/v1.3.0/seata-server-1.3.0.tar.gz
wget https://github.com/seata/seata/releases/download/v1.3.0/seata-server-1.3.0.zip

4.1 修改registry.conf

服务目录下:/seata/conf/registry.conf

注意:命名空间需要与上文中生成的保持一致。

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"group = "SEATA_GROUP"namespace = "61311143-2318-4af4-9180-ebxxx"username = "nacos"password = "nacos"}
}
config {# file、nacos 、apollo、zk、consul、etcd3、springCloudConfigtype = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = "61311143-2318-4af4-9180-ebxxx"group = "SEATA_GROUP"username = "nacos"password = "nacos"}
}

4.2 修改file.conf

服务目录下:/seata/conf/file.conf

## transaction log store, only used in seata-server
store {## store mode: file、db、redismode = "db"db {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql"driverClassName = "com.mysql.jdbc.Driver"url = "jdbc:mysql://Xx:3306/seata"user = "seata"password = "Xx"minConn = 5maxConn = 30globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}
}

4.3 启动服务

sh ./bin/seata-server.sh -h 127.0.0.1 -p 8091 -m db 

-h nacos 地址

-p seata服务端口 默认8091

-m 存在事务日志的类型 file 文件 db 数据库 redis...

注意:将合适的数据库链接jar包放到 lib目录,(msyql8+ 使用seata/bin/jdbc/mysql-connector-java-8.0.19.jar)。

5.简单XA模式集成

5.1 业务库中添加表

 参照官网:快速启动 | Seata

DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;

5.2 添加依赖

此版本需要收到手动重新导入依赖包(1.3.0),否则jar冲突导致启动报错。

       <!-- seata --><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-seata --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.3.0</version></dependency>

5.3 添加配置

my_test_tx_group使用需要注意。
seata:data-source-proxy-mode: XA # 开启XA事务registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址# 参考tc服务自己的registry.conf中的配置type: nacosnacos: # tcserver-addr: nacosipnamespace: "命名空间ID"group: SEATA_GROUPapplication: seata-server # tc服务在nacos中的服务名称cluster: default #集群tx-service-group: my_test_tx_group # 事务组,根据这个获取tc服务的cluster名称service:grouplist:seata-server: 指定seata的IP端口vgroup-mapping: # 事务组与TC服务cluster的映射关系my_test_tx_group: default

5.4 测试表

参照官网:快速启动 | Seata

DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

5.4测试代码

5.4.1订单

@RestController
@RequestMapping("/orderTbl")
public class OrderTblController {@Resourceprivate OrderTblService orderTblService;@PostMapping("/add/{userId}/{money}")public CxResult<Boolean> add(@PathVariable("userId") String userId, @PathVariable("money") Integer money) {return CxResult.success(orderTblService.add(userId, money));}}public interface OrderTblService extends IService<OrderTbl> {Boolean add(String userId, Integer money);}@Service
public class OrderTblServiceImpl extends ServiceImpl<OrderTblMapper, OrderTbl> implements OrderTblService {@DubboReferenceprivate AccountProviderService accountProviderService;@Override@GlobalTransactionalpublic Boolean add(String userId, Integer money) {OrderTbl orderTbl = new OrderTbl();orderTbl.setUserId(userId);orderTbl.setMoney(money);this.save(orderTbl);accountProviderService.addRecord(userId, money);if (money > 10000) {throw new BusinessException(ErrorMsg.COMMON_ERROR_1);}return Boolean.TRUE;}}

5.4.2 账户

public interface AccountProviderService {void addRecord(String userId, Integer money);
}@DubboService
public class AccountProvider implements AccountProviderService {@Resourceprivate AccountTblService accountTblService;@Override@GlobalTransactionalpublic void addRecord(String userId, Integer money) {AccountTbl accountTbl = new AccountTbl();accountTbl.setUserId(userId);accountTbl.setMoney(money);accountTblService.save(accountTbl);}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Gateway + Knife4j 4.3 实现微服务网关聚合接口文档

目录 前言Spring Cloud 整合 Knife4jpom.xmlapplication.ymlSwaggerConfig.java访问单服务接口文档 Spring Cloud Gateway 网关聚合pom.xmlapplication.yml访问网关聚合接口文档 接口测试登录认证获取登录用户信息 结语源码 前言 youlai-mall 开源微服务商城新版本基于 Spring…

右击文件或者文件夹使用vscode打开

平常我们在打开项目时&#xff0c;经常会需要快捷打开方式&#xff0c;直接使右键使用编辑器打开&#xff0c;但是有时在安装时忘记了选择 “Add “Open with Code” action to Windows Explorer file context menu” 在Windows资源管理器文件上下文菜单中添加“用代码打开”操…

ubuntu PX4 vscode stlink debug设置

硬件 stlink holybro debug板 pixhawk4 安装openocd 官方文档&#xff0c;但是第一步安装建议从源码安装&#xff0c;bug少很多 github链接 编译安装&#xff0c;参考 ./bootstrap (when building from the git repository)./configure [options]makesudo make install安装后…

服务器带宽忽然暴增,不停的触发告警

问题&#xff1a; 线上环境&#xff0c;服务器的外网下行带宽达到某个阈值&#xff0c;触发告警&#xff0c;查了下服务器的带宽监控信息&#xff0c;是从某个时间开始突然串上去的&#xff0c;然后监控图形非常有规律&#xff0c;都是每秒达到顶峰后&#xff0c;又立马下去了…

IDEA初步入门

1 安装 现在的系统更迭很快&#xff0c;很多软件都只支持win10 和 11了&#xff0c;但我们过时党还在用win7. 所以就必须找到合适的版本。在windows 7 64位系统下&#xff0c;可以使用IDEA 2020.1.4版本。 在Jetbrain官方下&#xff0c;找到历史版本&#xff0c;找到windows版…

php收发邮件的多种方法?

1、添加扩展&#xff1a; # 第一种&#xff1a; composer require php-imap/php-imap # 第二种&#xff1a; composer require phpmailer/phpmailer2、这里采用第二种方式&#xff1a; <?php declare(strict_types1);namespace App\Controller\v1\email;use App\Controll…

怎样利用 AI 大模型,辅助研发管理与效能提升?

AI 大模型已经逐渐渗透到各行各业的应用场景中&#xff0c;在软件研发领域也不例外。在软件研发领域&#xff0c;从需求分析到软件设计&#xff0c;从软件开发到测试&#xff0c;以及最后发布上线&#xff0c;AI 在各个环节都发挥着重要作用。10 月 21 日&#xff0c;思码逸首席…

计算机从内存中读取数组元素

在计算机中&#xff0c;我们可以把内存看成是一些排列好的格子&#xff0c;每个格子对应一个内存地址&#xff0c;那么数据会分散的存储在不同的格子中&#xff1a; 对于数组&#xff0c;计算机会在内存中为其申请一段连续的空间&#xff0c;并且会记下索引为0处的内存地址&…

图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】

目录 一、前言二、统计区域度量2.1&#xff1a;图像矩特征2.1.1&#xff1a;原始矩/几何矩2.1.2&#xff1a;中心距2.1.3&#xff1a;归一化的中心矩2.1.4&#xff1a;不变矩——Hu矩2.1.5&#xff1a;OpenCv实现矩特征及其应用 2.2&#xff1a;点度量特征2.3&#xff1a;全局直…

Jmeter之JSR223

一、JSR223组件 JSR是Java Specification Requests的缩写,意思是Java规范提案。JSR已成为Java界的一个重要标准. JSR223其实包含了有好几种组件,但是其用法都是一致的,并且都是执行一段代码&#xff0c;主要分类如下&#xff1a; JSR223 PreProcessor JSR223 Timer JSR223 S…

【二叉树经典题目】

根据二叉树创建字符串 本题的关键在于什么情况要省略括号&#xff0c;什么情况不能省略&#xff1a; 左右为空可以省略括号 左不为空&#xff0c;右为空可以省略括号左为空,右不为空不能省略括号 class Solution { public://1.左右为空可以省略括号//2.左不为空&#xff0c;右…

初识HTML超文本标记语言

文章目录 前端简介引入前端三剑客什么是HTML&#xff1f;超文本传输协议前戏HTTP超文本传输协议1.什么是HTTP协议2.四大特性3.数据格式4.响应状态码 基于HTTP协议搭建HTMLHTML简介HTML文档结构head常见标签1.meta 定义网页源信息(很多配置)2.style内部支持编写CSS代码3.link引入…

SpringCloud(二) Eureka注册中心的使用

在SpringCloud(一)中,我们学会了使用RestTemplate进行远程调用,但是在调用user-service时候需要在order-service中发送http请求,请求中需要书写对应微服务的ip和端口号,十分不方便,如果此时有多个user-service实例的话,就不知道调用哪个了(除非每次调用的时候都对ip和端口号进行…

论文-分布式-并发控制-并发控制问题的解决方案

目录 参考文献 问题 解法与证明 易读版本 参考文献 Dijkstra于1965年发表文章Solution of a Problem in Concurrent Programming Control&#xff0c;引出并发系统下的互斥(mutual exclusion)问题&#xff0c;自此开辟了分布式计算领域Dijkstra在文中给出了基于共享存储原子…

sqlite3 关系型数据库语言 SQL 语言

SQL(Structured Query Language)语言是一种结构化查询语言,是一个通用的,功能强大的关系型数据库操作语言. 包含 6 个部分: 1.数据查询语言(DQL:Data Query Language) 从数据库的二维表格中查询数据,保留字 SELECT 是 DQL 中用的最多的语句 2.数据操作语言(DML) 最主要的关…

易点天下受邀参与云栖大会,以AIGC重塑出海营销新范式

10月31日&#xff0c;2023云栖大会在杭州云栖小镇拉开帷幕。与往年不同&#xff0c;今年的云栖大会以“计算&#xff0c;为了无法计算的价值”为主题&#xff0c;与国际潮流科技大会组织方式接轨&#xff0c;通过云计算、人工智能、产业创新三大主题馆40000平科技展&#xff0c…

redis缓存穿透

redis缓存穿透 模拟一个缓存穿透的环境&#xff1a; redis缓存穿透1. 准备一个GET请求并且在第一次访问的时候将数据写入缓存2. 再次访问的时候首先判断缓存是否命中3. 命中了直接返回&#xff0c;未命中重建缓存1. 缓存空对象2. 布隆过滤器 1. 准备一个GET请求并且在第一次访问…

avi怎么转mp4?

avi怎么转mp4&#xff1f;如今市面上涌现了各种多样的视频格式&#xff0c;其中AVI作为一种音频视频交错格式&#xff0c;虽然使用较少但相对常见。它的优点在于占用空间较小&#xff0c;但画面质量并不是很出色。然而&#xff0c;AVI格式也存在一个明显的缺点&#xff0c;即兼…

柯桥专升本学校,自考本科文凭的价值如何?

自考本科文凭的价值如何&#xff1f; 自考本科学历是通过独立学习和考试获得的一种本科学历。对于自考本科学历的价值&#xff0c;很多人感到困惑&#xff0c;那么究竟自考本科学历有多大的价值呢? 首先&#xff0c;在就业市场上&#xff0c;自考本科学历具有一定的竞争力。随…