springcloud-05分布式事务

news2024/11/16 5:26:06

第五章 分布式事务Seata

在微服务系统中,分布式事务是我们必须要面临和解决的问题!!!

1. 分布式事务问题的产生

下图中的例子可以很好的解释分布式事务问题出现的场景:
在这里插入图片描述
图中问题的产生就在于更新库存数量是1个单独的事务,不受下订单方法所在事务的控制,更新库存数量方法执行之后,数量就已经持久化到数据库,后续的保存订单操作若出现异常也和它无关。这符合事务的隔离性持久性的特性。事务的另外2个特性:原子性一致性
针对上述问题,目前比较主流的技术就是阿里巴巴推出的开源分布式事务解决方案Seata。

2. Seata简介和安装

根据Seata官网的描述:Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
从官网上截取的一个关于Seata如何处理分布式事务的图:
在这里插入图片描述
Seata术语解释:
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
通俗理解:统筹协调各个分支事务的全局事务管理者,这个必须要另外启动一个seata的服务端。

TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
通俗理解:一般是分布式事务的发起方。需要我们在微服务端进行Seata的配置。

RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
通俗理解:RM一般是事务的参与者,也就是各个分支事务。需要我们在微服务进行Seata的配置

Seata Client - Seata客户端
每个引入了Seata依赖的微服务都称之为Seata客户端

Seata Server - Seata服务端*
Seata服务端也是一个微服务,需要注册到注册中心(一般是nacos)作为分布式事务的全局管理者,对分布式事务进行协调和处理。

注意:针对于Seata的理论部分,这里不做过多说明,本文只是交给大家如何使用,理论部分可去Seata官网或者去B站看看相关视频即可有一定的理解。

问题:如何使用Seata处理分布式事务问题?

  1. 使用Seata前,修改Seata下conf文件夹下的相关文件,比如:file.conf,registry.conf;
  2. 使用数据库(推荐mysql)创建数据库(一般为seata)和表,建表sql一般在Seata的github官网可以找到存储分布式事务相关数据;
  3. 使用命令将客户端的相关配置(配置文件为config.txt)上传到nacos进行管理;
  4. 先启动Seata server作为微服务,,并将其注册到注册中心(一般选取nacos作为注册中心);
  5. 在需要使用分布式事务的微服务引入Seata的依赖,并编写配置文件。启动微服务即可完成Seata的引入。
    接下来我们就上述步骤进行细致分解:
    以下配置以windows10环境,Seata版本1.3.0,mysql 5.7+,jdk 1.8为准!!!

2.1 下载Seata

这里我们下载2个文件夹

2.1.1 下载配置文件相关文件夹seata-1.3.0

下载地址:https://github.com/seata/seata
将Seata项目以zip压缩包的形式下载。
在这里插入图片描述
下载及解压后如下图:
在这里插入图片描述
说明:为什么要下载上述文件夹?
因为如果只下载seata-server项目的话,初始化的sql脚本自1.0版本之后不在随项目提供,另外关于seata的客户端配置也没有提供。缺失的文件都在上面下载的文件夹的script目录中,因此我们有必要将其下载。

我们主要使用script,这里主要介绍script文件夹下的内容:
在这里插入图片描述
2. Seata server微服务seata下载
下载地址:https://github.com/seata/seata/releases
在这里插入图片描述
下载之后解压:
在这里插入图片描述
由于启动seta-server端服务需要提前配置或修改一些配置文件,比如要上传到nacos的seata客户端的配置,seata数据库的建表语句等。因此我们才在2.1.1中将这些文件事先下载。

2.2 数据库准备

在mysql数据库中创建一个数据库seata
在这里插入图片描述
使用数据库管理工具执行目录C:\software\seata-1.3.0\script\server\db(不同电脑存放路径不同)下的mysql.sqlsql文件。
在这里插入图片描述
这样的话,Seata相关的数据库和表就准备好了。
注意:如果数据库的名称不是seata,那么后面对应的配置文件中关于数据库的连接的配置也要对应修改!

2.3 修改seata配置文件(重点)

由于seata服务端的默认配置是以file文件的形式存储分布式事务中的信息的 。我们想要以数据库的存储方式来替换掉,因此需要修改相关配置文件。
打开目录C:\software\seata\conf(不同电脑存放路径不同):
在这里插入图片描述

2.3.1 修改file.conf文件

在这里插入图片描述

2.3.2 修改registry.conf文件

在这里插入图片描述

2.4 上传客户端配置到注册中心nacos(重点)

2.3.2中我们配置了连接nacos配置中心,要将seata关于客户端的配置上传到nacos配置中心,那么配置文件呢?需不需要修改呢?
打开目录C:\software\seata-1.3.0\script\config-center(不同电脑存放路径不同):
在这里插入图片描述
config.txt中的内容都是以键值对的形式存储的seata关于客户端的配置信息。在1.0版本之前键以-隔开每个单词如:vgroup-mapping,1.0的版本以驼峰命名法命名如:vgroupMapping。修改文件config.txt
在这里插入图片描述

更正:上图中的.yml/yalm/application 更改为:yml/yaml/properties!!!

接下来我们使用命令将config.txt中的配置上传到nacos配置中心。打开目录C:\software\seata-1.3.0\script\config-center\nacos(不同电脑存放路径不同):
在这里插入图片描述
.sh结尾的文件是linux脚本命令,这里我们使用的windows系统,需要安装git才可以执行该命令。
git下载地址:https://git-scm.com/downloads
在·nacos-config.sh·所在目录打开git命令窗口,执行以下命令:
在这里插入图片描述
参数说明:
-h nacos所在主机地址。如:127.0.0.1;
-p nacos端口号。如:8848;
-t 命名空间。如:ae5104ef-bb91-467f-b1f4-c93f3b4ab326。
-g 分组组名。 如:DEFAULT_GROUP;

可根据需要进行添加。添加前要对照registry.conf中关于config下的配置,要和里面的配置保持一致。否则配置信息上传到不同的命名空间和分组,会导致后面使用seata客户端拉取不到对应的配置信息。
执行命令后,若出现以下内容:
在这里插入图片描述
表明配置信息已经上传到nacos配置中心,此时可以查看nacos界面:
在这里插入图片描述

2.5 启动seata服务

启动客户端很简单。进入目录C:\software\seata\bin(不同电脑路径不同):
在这里插入图片描述
在该目录打开cmd命令窗口win+R输入以下内容:
在这里插入图片描述
出现以下内容:
在这里插入图片描述
seata服务端启动成功,默认端口8091。此时查看nacos的服务:
在这里插入图片描述

2.6 配置Seata客户端

2.6.1 引入Seata依赖

本次引入的seata的版本是1.3.0

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <!--spring-cloud-starter-alibaba-seata引入的Seata引入的版本与我们使用的seata版本不一样,故将其排除-->
    <exclusions>
        <exclusion>
            <artifactId>seata-spring-boot-starter</artifactId>
            <groupId>io.seata</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!--引入我们指定的Seata版本-->
<dependency>
	<groupId>io.seata</groupId>
	<artifactId>seata-spring-boot-starter</artifactId>
	<version>1.3.0</version>
</dependency>

2.6.2 编写配置文件

在使用分布式事务的微服务端的配置文件.yml/.yaml/.properties中配置如下:

spring:
  cloud:
    alibaba:
      seata:
      	# 自定义事务组的名称:这里自定的事务组名称为xgwms_inventory_tx_group
        tx-service-group: xgwms_inventory_tx_group
seata:
  enabled: true
  # 哪个微服务要使用分布式事务
  application-id: ${spring.application.name}
  # 分布式事务组组名
  tx-service-group: xgwms_inventory_tx_group
  enable-auto-data-source-proxy: true
  registry:
    type: nacos
    nacos:
      application: seata-server
      # nacos注册中心地址
      server-addr: 120.26.0.43:8848
      # 注册到哪个命名空间,默认为public
      namespace: ae5104ef-bb91-467f-b1f4-c93f3b4ab326
      # nacos服务所在分组组名
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
  config:
    type: nacos
    nacos:
      # namcos配置中心地址
      serverAddr: 120.26.0.43:8848
      # 哪个命名空间的配置,默认为public
      namespace: ae5104ef-bb91-467f-b1f4-c93f3b4ab326
      # nacos客户但配置所在分组组名
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
  service:
    vgroup-mapping:
      xgwms_inventory_tx_group: default

以上只是关于seata分布式事务的配置,其它配置省略。启动配置好seata的微服务,控制台结果如下:
在这里插入图片描述

2.6.3 Seata的使用

在要使用分布式事务的入口方法上添加注解@GlobalTransaction即可实现分布式事务的控制。比如:
在这里插入图片描述

3 Seata安装遇到的问题及解决办法

3.1 Seata启动后,在nacos显示的ip不是真实的服务器ip

场景描述:我把seata部署到了自己购买的一台阿里云服务器上(例如IP为120.26.0.43),使用命令seata-server.bat启动之后,登录到nacos查看,发现seata的ip和阿里云服务器实际ip不同,是一个内网地址,此时又启动了seata客户端,控制台报错,该怎办?

在这里插入图片描述
客户端报错:
在这里插入图片描述
可是我的服务器地址明明是120.26.0.43,为什么启动之后变成了172.25.60.251?
解决办法:启动seata-server的时候带上参数:seata-server.bat -h 120.26.0.43
在这里插入图片描述
此时,seata客户端就可以正常启动了。

3.2 An exceptionCaught() envent was fired…异常

我们在停止一个seat客户端后,发现seat-server后台报错,且乱码:
在这里插入图片描述
出现了异常:
这个错误是由非正常Seata客户端建立连接引起(如通过http访问Seata server的端口,云服务器的端口扫描等)。这种连接没有发送注册信息,被认为是无用连接,该异常可以忽视。

乱码解决:
打开cmd窗口,输入:chcp 65001意思是设置当前窗口使用UTF-8编码。在该窗口启动seata-server服务,就不会出现乱码了。注意:该方法只能临时设置cmd窗口编码方式,若另开一个cmd窗口,则编码依然是GBK
在这里插入图片描述

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

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

相关文章

泛型Java

泛型 泛型&#xff1a;标签 集合接口和集合类在jdk5.0之后都修改为带泛型的结构在实例化集合类时&#xff0c;可以指明具体的泛型类型指明完以后&#xff0c;在集合类或者集合接口中凡是定义类或接口时&#xff0c;内部结构使用到泛型的位置&#xff0c;都指定为实例化时的泛…

Java姓名与手机号中间用*号代替 字符串*号替换

/*** 姓名与手机号中间用*号代替*/public static String caseStarSymbol(String nameStr){ // String nameStr "程序源码论坛"; // String mobile "15888888888";String nameStr1 null;char[] r nameStr.toCharArray(); // char[] m mobi…

服务器硬件规格常用查看命令——磁盘相关命令

smartctl smartctl是一个能够控制和监控磁盘的SMART&#xff08;Self-Monitoring&#xff0c;Analysis and Reporting Technology&#xff0c;自我监测、分析和报告技术&#xff09;命令。 使用方法&#xff1a; 提示&#xff1a;使用该命令只能查看到裸盘设备的型号信息&…

ATtiny13与Proteus仿真-开发与Proteus仿真环境搭建

ATtiny13开发与Proteus仿真环境搭建 本文将详细介绍如何搭建ATtiny13开发环境与Proteus仿真环境。 1、ATtiny13开发环境搭建 本系列文章将使用Microchip Studio作为ATtiny13的集成开发环境(IDE)。 Microchip Studio 是一个集成开发环境 (IDE),用于开发和调试 AVR 和 SAM 微…

Microsoft .NET Desktop Runtime (Framework)

Microsoft .NET Desktop Runtime (Framework) 微软NET Framework或数据库网络是一种软件技术&#xff0c;包括Microsoft的几种编程语言。安装每个窗口后所需的工具之一是NETFramework技术。会的。基于这种技术编写的许多软件工具&#xff0c;它们将得到支持。 -是的。 微软得分…

什么是运放的输入失调电压

大家可以看到这个电路&#xff0c;运放的同相端和反相端都接在0V&#xff0c;大家觉得运放的输出电压是多少。 很多同学觉得&#xff0c;在开环条件下根据运放的传输曲线&#xff0c;当同相端电压等于反相端电压时&#xff0c;运放的输出电压等于0&#xff0c; 可是实际测量运放…

语音识别之Kaldi:神经网络实战

ASR神经网络实战 kaldi语音识别理论与实践课程学习。 之前学习了基于GMM-HMM的传统语音识别&#xff1a;GMM-HMM 其中也包含Kaldi架构的简介&#xff0c;语音数据的预处理&#xff0c;特征提取等过程。 今天学习基于神经网络的语音识别。 神经网络训练脚本 以TDNN为例。 K…

Python IDE之 pycharm的十大奇技淫巧

说到Python的IDE&#xff0c;可能大家都会想到一个非常有名的工具&#xff0c;就是pycharm&#xff0c;他是最受欢迎的一个Python开发工具&#xff0c;其原因就是因为功能强大&#xff0c;适合构建大型项目&#xff0c;当然啦&#xff0c;功能强大同时也就意味着操作复杂&#…

语音学发音语音学笔记

词汇表 articulators 咬合架发音器 cochlea 耳蜗 consonants 元音 dialect 方言 eardrum 鼓膜 endolymph 内淋巴 Epiglottis 喉头盖 formants 共振峰 fricative 摩擦音 Larynx 喉 meatus 耳道 monosyllabic 单音节 pinna 耳廊 pitch 音调 pitch harmonics 音高泛音 phonation …

【云原生 | Kubernetes 实战】09、K8s 控制器 Replicaset 入门到企业实战应用

目录 K8s 控制器 Replicaset 一、Replicaset 控制器&#xff1a;概念、原理解读 1.1 Replicaset 概述 1.2 Replicaset 工作原理&#xff1a;如何管理 Pod &#xff1f; 二、Replicaset 资源清单文件编写技巧 三、Replicaset 使用案例&#xff1a;部署 Guestbook 留言板 …

第16章 母函数

第16章 母函数 母函数是离散数学领域最意外、最有用的发明之一。粗略来讲&#xff0c;母函数将序列问题转化为代数问题。 组合数学中常常出现普通型母函数、指数型母函数、狄利克雷型母函数 16.1 无穷级数 通俗地说,母函数F(x)就是无穷级数 符号[xnx^nxn]F(x)表示母函数F(x…

策略模式学习

0.引言 最近想整理一下代码。我的想法是使用继承的方案&#xff0c;使用多态写一个interface&#xff0c;然后不同的方法来继承它。最近ChatGPT比较火&#xff0c;顺便问了一下它&#xff1a; 在C代码设计中&#xff0c;我对同一算法设计了不同的实现&#xff0c;例如计算平均…

使用 Web 应用程序示例在 Java 中进行安全编码

使用 Web 应用程序示例在 Java 中进行安全编码 使用 Java 中的 Online Shop Web 应用程序示例了解最常见的漏洞以及如何避免它们 课程英文名&#xff1a;Secure coding Dive into Injections with Java & Spring boot 此视频教程共36.0小时&#xff0c;中英双语字幕&…

1x9 Dual SC Optical Transceivers

1、Pin Assignment & Description TD, TD-: DC coupled LVPECL inputs for the transmitter. 50Ω differential lines. RD, RD-: Open-emitter out circuits. DC coupled LVPECL outputs for the receiver. 50Ω differential lines. SD: Signal Detect. Normal opti…

【工业控制】多变量动态矩阵预测控制(DMC)【含Matlab源码 1499期】

⛄一、简介&#xff08;附课程报告&#xff09; 1引言 众所周知&#xff0c;上世纪 60 年代初形成的现代控制理论在航空、航天等领域取得了辉煌的成果。 然而人们不久就发现在完美的理论与控制之间还存在着巨大的鸿沟。主要表现在以下几个方面: 1.现代控制理论的基点是对象精确…

OneHotEncoder独热编码

首先了解机器学习中的特征类别&#xff1a;连续型特征和离散型特征。 拿到获取的原始特征&#xff0c;必须对每一特征分别进行归一化&#xff0c;比如&#xff0c;特征A的取值范围是[-1000,1000]&#xff0c;特征B的取值范围是[-1,1].如果使用logistic回归&#xff0c;w1*x1w2…

Docker-compose编排

一、Docker Compose前言 Docker Compose的前身是Fig&#xff0c;Fig被Docker收购之后正式更名为Compose&#xff0c;Compose向下兼容Fig Docker Compose是一个用于定义和运行多容器Docker应用的工具&#xff0c;只需要一个Compose的配置文件和一个简单的命令就可以创建并运行应…

STC 51单片机61——呼吸灯

#include "reg52.h" sbit LedHuxi1P1^0; #define time (65536-1000) // 单次定时1ms unsigned char T_High, T, ti, dir; void InitTimer0(void) { TMOD0x01; TL0 time; //initial timer1 low byte TH0 time >> 8; …

从来没有一家互联网公司不问【设计模式+SSM框架底层源码】

结构型模式 创建型模式 行为型模式 六大原则 免费分享学习设计模式整理的学习笔记文档 Spring5源码解读 **其实&#xff0c;学习编程不是学习配置东西&#xff0c;然后写编程套路。写程序最重要的是你能心中有自己的一套架构思路&#xff0c;比如我现在就没有写Java的项目…

还在公域流量里面投入大量广告费而无法变现,不如试试私域流量吧

大家好&#xff0c;我是林工&#xff0c;不知道大家听说过私域流量这个词没有&#xff0c;听起来是一个听起来很模糊的概念。很多人都知道它大概的意思&#xff0c;但具体要落实到“私域流量怎么做”这件事情上&#xff0c;大都都是一问三不知&#xff0c;不知道该如何入手。 其…