SpringCloud Alibaba - Seata 部署 TC 服务,并集成微服务

目录

一、Seata 架构

1.1、Seata 架构重要角色

1.2、部署 TC 服务

1.2.1、前言

1.2.2、下载 seata-server 包,解压

1.2.3、修改配置

1.2.4、在 nacos 中添加配置

1.2.5、创建数据库表

1.2.6、启动 TC 服务

1.3、微服务集成 Seata

1.3.1、引入依赖

1.3.2、修改配置文件(添加 Seata)


一、Seata 架构


1.1、Seata 架构重要角色

Seata 事务管理中,有以下三个重要的角色:

  1. TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  2. TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  3. RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

三者之间的关系

1. 分布式事务有一个入口方法,会去调用多个微服务,每调用一个微服务就相当于一个分支事务.  因此整个入口方法就定义全局事务的范围,TM 就会去监控这个入口的方法,也就知道这个事务里有多少分支事务.

2. 当入口方法被执行时,TM 会首先拦截当前这个执行的动作,然后向 TC 发送一个请求,注册全局事务.  那么接下来,就可以去执行这个入口的业务逻辑了,进一步的,分支事务也就开始执行了.

3. RM 此时就要上场了,他会在分支事务执行的时候拦截下来,然后向 TC 注册这个分支事务,告诉他说“我是属于哪个全局事务,这里有一个分支要执行了啊”.   然后 RM 就可以执行这个业务的 sql(为甚叫就资源管理器,因为资源指的是数据库,RM 就需要执行sql).  执行完后再把当前分支事务的状态报告给 TC(执行成功了?还是回滚了?).  这样一来,TC 就知道每一个分支事务的状态了. 

4. 等到 TM  这边的入口方法全部执行完毕了,就可以提交这个事务到 TC 了(告诉他说:“我这边处理完了,接下来看你怎么办吧~”). 之后 TC 就会去检查刚刚注册的每一个分支事务的状态,如果都是成功的,就告诉这些 RM 说:“你们去提交吧”.  如果 TC 这边检查到有失败的,那就让他们全部回滚.

Ps:以上只是分布式事务解决方案的基本模型,不是最终的解决方案. 在后续的章节中,也会讲到的.

1.2、部署 TC 服务

1.2.1、前言

刚刚我们已经知道了 Seata 中三个重要角色,其中 tm 和 rm 是对业务的管理,而  tc 则是脱离业务之外的独立服务,需要协调 tm 和 rm,协调全局事务和分支事务.

这里我就来带大家搭建一下 Seata 的 TC 服务.

1.2.2、下载 seata-server 包,解压

首先我们要下载 seata-server 包,官网地址如下:

http://seata.io

Ps:在非中文目录解压这个 zip 包.

1.2.3、修改配置

修改 conf 目录下的 registry.conf 文件.

registry {# tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等type = "nacos"nacos {# seata tc 服务注册到 nacos的服务名称,可以自定义application = "seata-tc-server"serverAddr = "127.0.0.1:8848"group = "DEFAULT_GROUP"namespace = ""cluster = "SH"username = "nacos"password = "nacos"}
}config {# 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置type = "nacos"# 配置nacos地址等信息nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"username = "nacos"password = "nacos"dataId = "seataServer.properties"}
}

1.2.4、在 nacos 中添加配置

为了让 TC 服务的集群可以共享配置,这里我们选择了 nacos 做为统一的配置中心.

因此服务端配置文件 seataServer.properties 文件需要在 nacos 中配置好.

Ps:DataID 和 Group 要对应 registry.conf 文件中的配置 

配置内容如下:

# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=jaodfhgaduqheqh82043ht^&*(%$ioueryg0gu3q0gq3gusaioy8tq94gyu80q32g
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

Ps:以上只有数据的存储方式需要我们自己配置,其他的都可以不配置(走默认配置),上面配置的原因是方便以后修改默认配置.  

1.2.5、创建数据库表

TC 服务在管理分布式事务时,需要记录事务相关数据到数据库,因此需要提前创建好这些表

分支事务表如下:

DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table`  (`branch_id` bigint(20) NOT NULL,`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`transaction_id` bigint(20) NULL DEFAULT NULL,`resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`status` tinyint(4) NULL DEFAULT NULL,`client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`gmt_create` datetime(6) NULL DEFAULT NULL,`gmt_modified` datetime(6) NULL DEFAULT NULL,PRIMARY KEY (`branch_id`) USING BTREE,INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

全局事务表如下:

DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table`  (`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`transaction_id` bigint(20) NULL DEFAULT NULL,`status` tinyint(4) NOT NULL,`application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`timeout` int(11) NULL DEFAULT NULL,`begin_time` bigint(20) NULL DEFAULT NULL,`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`gmt_create` datetime NULL DEFAULT NULL,`gmt_modified` datetime NULL DEFAULT NULL,PRIMARY KEY (`xid`) USING BTREE,INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;SET FOREIGN_KEY_CHECKS = 1;

1.2.6、启动 TC 服务

Windows 系统进入 bin 目录,运行 seata-server.bat 即可.

启动完成后,可以看到默认端口是 8091(当然这个端口不是给你访问的,而是给 tm 和 rm 访问的).

之后,打开浏览器,输入 nacos 地址:localhost:8848/nacos,进入服务列表页,就可以看到 seata-tc-server 的信息,表明注册成功,如下.

1.3、微服务集成 Seata

1.3.1、引入依赖

引入的 seata 依赖中,默认的 seate starter 依赖版本太低,因此通过 exclusion 排除,引入 seata starter 1.4.2 版本.

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><!--版本较低,1.3.0,因此排除--><exclusion><artifactId>seata-spring-boot-starter</artifactId><groupId>io.seata</groupId></exclusion></exclusions>
</dependency>
<!--seata starter 采用1.4.2版本-->
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>${seata.version}</version>
</dependency>

1.3.2、修改配置文件(添加 Seata)

配置 application.yml,让微服务通过注册中心找到 seata-tc-server.

要找到 nacos 服务,就需要配置:namespace + group + serviceName + cluster

其中 cluster 的配置需要注意,通过映射配置.

内容如下:

seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址# 参考tc服务自己的registry.conf中的配置type: nacosnacos: # tcserver-addr: 127.0.0.1:8848namespace: ""group: DEFAULT_GROUPapplication: seata-tc-server # tc服务在nacos中的服务名称tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称service:vgroup-mapping: # 事务组与TC服务cluster的映射关系seata-demo: SH

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

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

相关文章

证书显示未受信任,生成的证书过期

此时若是导入证书后&#xff0c;证书显示未受信任&#xff0c;则说明我们缺失最新的AppleWWDRCA证书 解决方案&#xff1a; 重新下载AppleWWDRCA并安装。即下载最新的AppleWWDRCA证书&#xff0c;双击安装到“登录”项的钥匙串下&#xff1b;然后再安装你的开发证书或者发布证书…

SpringBoot中使用Servlet和Filter

为什么要把Servlet和Filter写在一起,因为使用方式很相似 两种方式 第一种,使用Servlet和Filter 使用Servlet 继承HttpServlet 注册Servlet 使用Filter 1.自定义过滤器 2.注册过滤器 这里注意一点 使用/**无效 至少我这2.4.5版本是这样 过滤所有请求用/* 那么其实还有…

Java练习day3

一、验证回文串 1、题目链接 点击跳转到题目位置 2、代码 class Solution {public boolean judge(char ch){if((ch > a && ch < z) || (ch > 0 && ch < 9)){return true;}return false;}public boolean judge1(char ch1, char ch2){if(ch1 ch…

如何在idea中隐藏文件或文件夹

例如我想要隐藏如下文件 只需要点击file->settings editor->file types->ignores Files and Folders-> 然后按照图片点击顺序操作即可 添加完毕点击apply->ok 隐藏成功后效果如下&#xff1a;

力扣第 365 场周赛虚拟参赛

有序三元组中的最大值 I class Solution { public:long long maximumTripletValue(vector<int>& nums) {vector<long long> num;for (auto &item:nums) {num.push_back(item*1ll);}long long z 0,f 1000000;long long ans 0;long long maxx num[0],mi…

CSS中:root伪类的使用

在CSS中&#xff0c;:root是一个伪类选择器&#xff0c;它选择的是文档树的根元素。在HTML文档中&#xff0c;这个根元素通常是<html>。:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。 例如&#xff0c;你可以使用:root来定义一个全局的字体大小&a…

java spring IOC的三种方式之XML形式

IOC IOC就是将获取对象的方式将给框架&#xff0c;或者交给容器进行&#xff0c;有三种方式 基于Xml 元数据模式基于注解的配置基于Java config XML形式 相关的注解 需要再相应的对象类class上使用 Component修饰&#xff0c;表示是一个beacon。&#xff0c;然后再XML中配…

基于SpringBoot的应急物资申请管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

添加路径到头文件默认搜索路径

在linux环境下写代码&#xff0c;出现函数是从其他文件引用的&#xff0c;需要把该文件的搜索路径添加到当前文件。 注意&#xff0c;除非必要&#xff0c;一般不建议这样做。比较好的方式是写入到CMakeLists或者Makefile中。 一次性生效&#xff0c;命令行输入即可&#xff…

FFmpeg 命令:从入门到精通 | ffmpeg 命令裁剪与合并视频

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令裁剪与合并视频 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令裁剪与合并视频裁剪生成测试文件拼接文件拼接不同编码的文件 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令裁剪与合并视频 本节主要介绍了一些使用…

Git使用【上】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 前言 先前有些git命令我在我的其它文章里面已经写过&#xff0c;若要查看可参考【Linu…

蓝桥杯每日一题2023.9.28

AcWing 4409. 砍竹子 - AcWing 题目描述 题目分析 注&#xff1a;sqrtl的范围为long double&#xff0c;比sqrt更加精确 使用优先队列维护一段区间&#xff0c;如果连续一段相同就合并为一个区间&#xff0c;从大到小去枚举&#xff0c;每次先取出最大的一段&#xff0c;双…

Ubuntu中启动HDFS后没有NameNode解决办法

关闭进程&#xff1a; stop-dfs.sh 格式化&#xff1a; hadoop namenode -format 出现报错信息&#xff1a; 23/10/03 22:27:04 WARN fs.FileUtil: Failed to delete file or dir [/usr/data/hadoop/tmp/dfs/name/current/fsimage_0000000000000000000.md5]: it still exi…

Windows电脑多开器的优缺点对比

Windows电脑多开器是一种能够让用户同时运行多个应用程序、游戏或者网页的软件工具。它的作用在于让用户能够更加高效地工作、学习或者娱乐。但是&#xff0c;这种软件也存在一些优劣势的对比。 优点&#xff1a; 提升工作效率。多开器可以让用户同时打开多个应用程序或者网页…

libevent源码学习笔记

libevent源码学习笔记 libevent安装libevent源码解析&#xff08;1&#xff09;事件对象&#xff08;2&#xff09;事件操作&#xff08;3&#xff09;事件循环&#xff08;4&#xff09;事件处理 常用指令问题记录问题一&#xff1a;长连接的管理问题二&#xff1a;连接关闭问…

【云备份项目】:环境搭建(g++、json库、bundle库、httplib库)

文章目录 1. g 升级到 7.3 版本2. 安装 jsoncpp 库3. 下载 bundle 数据压缩库4. 下载 httplib 库从 Win 传输文件到 Linux解压缩 1. g 升级到 7.3 版本 &#x1f517;链接跳转 2. 安装 jsoncpp 库 &#x1f517;链接跳转 3. 下载 bundle 数据压缩库 安装 git 工具 sudo yum…

acwing1291题解(约数)

今天是贝茜的生日&#xff0c;为了庆祝自己的生日&#xff0c;贝茜邀你来玩一个游戏&#xff0e; 贝茜让 N头奶牛&#xff08;编号 11 到 N&#xff09;坐成一个圈。 除了 11 号与 N 号奶牛外&#xff0c;i 号奶牛与 i−1 号和 i1 号奶牛相邻&#xff0c;N号奶牛与 11 号奶牛…

复习Day08:哈希表part01:242.有效的字母异位词、349. 两个数组的交集、1. 两数之和、160. 相交链表

之前的blog&#xff1a;https://blog.csdn.net/weixin_43303286/article/details/131765317 我用的方法是在leetcode再过一遍例题&#xff0c;明显会的就复制粘贴&#xff0c;之前没写出来就重写&#xff0c;然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用…

2023年中国家用智能门锁市场发展概况分析:家用智能门锁线上市场销量290.4万套[图]

智能门锁是指区别于传统机械锁的基础上改进的&#xff0c;在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 先进技术的复合型锁具。 智能门锁级别分类 资料来源&#xff1a;共研…

Linux使用之xshell、xftp保姆教学(含安装包,详细使用方法,连接失败解决方法)

前言 链接: FTP&#xff0c;SSH服务器介绍 这是我之前写的一篇博客&#xff0c;其中介绍了Ubuntu操作系统的一些常用命令以及服务器介绍&#xff0c;这篇文章就向大家详细介绍如何安装及应用这些服务器&#xff0c;我以xshell、xftp为例。 安装包&#xff0c;使用方法&#xf…