00:00
前面我们讨论了一下分布式事务的几种解决方案,当这些呢都是一些概念,那回过头我们的订单代码,那现在订单呢是这一块,那订单呢会在这儿保存订单,并且远程锁库存,有可能还有远程扣减积分的服务,当我们这个服务出现异常,比如我们这个第五步出现异常,我们就用这个数学异常来模拟异常们以前发生的现象是订单回滚,库存不回滚,因为我们这一出异常以后呢,们上面订单感知到了,那订单自己回滚,这是他本地事物的调整,但已经做了的这个远程库存服务,他没法回滚,那么现在来看一下,想要他回滚怎么回滚呢?你先来确认一下,我们现在就是这个模式,好,那先来确认一下我们的这个库存锁定,现在呢都是二,以及我们的这个订单,现在只有一个订单,我们看一下我们这种模式下,确实应该是订单回滚,库存不滚,我们想要让他们要么都回滚,要么呢都提交成功,我们先来看一下现在的模式。
01:00
走,我来刷新,来点一个提交订单。好,那现在呢,发现回到订单确认页,那就是订单提交失败了,那失败以后呢,我们来看一下,反正我们控制台这一块呢,有我们相关的失败,这个数学运算异常之类的,我们现在来看我们的这一块订单,我先来刷新订单这一块呢,发现它没有创建出新的订单,说明订单回滚了,再来看库存,原来U2呢变成三,那说明库存加上去了,所以我们现在呢是没有达到分布式事务的效果,那么想要做分布式事五怎么做呢?那么就可以使用我们spring cloud阿里巴巴给我们带来的西塔这个组件,Spring cloud阿里巴巴我们用了nacos,接下来我们来用一下西A,西A是什么西ta呢?是我们这个阿里巴巴提供的一款开源的分布式事务解决方案,它呢,致力于我们什么高性能,简单易用。而且呢,我们这个西塔现在为我们提供了非常多种分布式事物模式,首先AA就是我们说的auto传C自动事物模式,还有我们说的TCC,诶我们以前的这个,包括我们西塔介绍的,它也支持XH5,以及它还支持我们这个叫cga,这个cga呢在下边也都有,那我们现在呢,就来使用西塔来做我们的这个分布式事务,那怎么做,我们还是先来参照它的这个快速开始文档,我的这一块网络比较慢,我们大家点这个快速启动就会来到我的这个网页,我们来看一下我们的西塔怎么用,我们来看它的现在这个场景,它这个场景呢,就是我们一个业务,这是库存,这是订单,这是账户,然后呢,它的这个业务我们要调用扣库存,调用创订单,调用从账户里边来扣钱,要调用三个服务,它主要业务逻辑呢,是这么来写的,我们也无需写这个业务逻辑,我们现在的这个业务逻辑都在这儿,我们希望他能帮我们能控住,那接下来看。
02:55
如果是我们这个西塔,它如何控制我们这个分布式事物,它是这么来控的。
03:00
首先在西塔里边有这么几个概念,第一个叫RM,还有一个TM,还有一个TC,这三个概念都是什么?我们来到这一块西塔的术语表里边来看一下它的这个介绍,首先TC它呢称为事物协调者,它呢是维护我们全局这些事务状态的,所以呢TC它是一个协调者,要维护全局。我们现在呢,假设是下单业务,下单业务要调用我们1233个远程服务,那通过TC就要协调这三个远程服务到底是都要提交还是都要回滚,所以这个TC呢,类似于我们二阶提交协议的那个TM trans manager。当然我们现在来看一下,在我们的这个术语里边,还有一个叫TM事务管理器,这个事务管理器大家来看这张图,事务管理器呢是标在我们business这一块的,因为我们现在来看我们business这个业务代码,我们在。
04:01
在这儿呢,开启了一个相当于完整的事物,相当于我们要做这个方法的时候,我们要要调用三个远程方法,所以呢,我们这个方法呢,它有一个事务管理器,它来负责开启我们的总事务,所以这个事务管理器它呢是来定义我们全局事务的,就是控制我们总事务的,然后还有一个叫资源管理器,来看一下资源管理器的位置,大家会发现呢,资源管理器是在各个的服务里边,相当于它直接和当前服务的数据库来交互,那就相当于我们以前的如果用spring在单体模式下我们的这个事务管理器一样,我们就可以把它称为资源管理器,所以现在呢,这三者的角色就是PC来负责协调全局,然后呢,TM是来控制我们这个大事务,然后呢,每一个微服务里边自己的事务是用RM,这个叫。
05:01
资源管理器来控制的,那么他们三个呢,是这么来工作的,我们可以来看一下这个流程,我把这一块呢放大一点,那现在呢是这个流程,我们现在呢,现在这有一个TC,我们现在要执行一个大下单业务,大下单业务呢,接下来我们的这个下单业务的TM由事务管理器先会告诉TC,我们准备要开启一个全局事务了,所以我们整个协调器呢,就知道行,我们现在呢,可能要跨服务开一个全局的事物,要么这些都成功,要么这些都失败,那接下来怎么办呢?只要他告诉了我们这个协调器,大家注意,这是一个双向剪头,它告诉这个协调器我们要开始全局事物了,那接下来它调用第一个。微服务的事务方法的时候,我们这个服务呢,就会给我们协调器注册一下,我们称为叫分支,我们把这个事物呢叫分支事务,它呢相当于它的资源管理器,告诉协调器行,我这儿呢有一个分支事务,并且呢,他要实时汇报他的这个事务状态,Report s letters,他的这个事务是成了还是败了,所以呢,我们这个TC就能实时的知道我们这个服务他的事务是成了还是败了,只要我们这个分支无论是提交还是回购TC呢都知道,然后接下来我们这个大业务,第一个远程服务调完了,他再来调我们第二个远程服务,第二个远程服务呢,同样它呢也会在我们的事务协调器里边,由于我们这第二个远程服务也是一个事务,每一个里边呢,都事务自制好,所以呢,他在我们这个TC里边,他也要注册自己的分支事务,并且呢实时给TC汇报。
06:50
我们当前的这个事务状态,然后呢,还有我们接下来要调到第三个事务了,然后呢,第三个微服务的这个事务管理器也有它的资源管理器,同样也会给TC里边,就是我们全局的这个协调者,给里边呢注册它的分支事务,并且汇报状态,那这样就好了,我们这个大事物一开启,每掉一个小事物呢,TC都知道当前这个小事物成了还是败了,那假设呢,我们调到最后一个,最后一个这个小事务给TC汇报状态,说完了我这个执行失败了,我得回滚了,所以呢,我们第四个分支事务相当于回滚了,回滚了怎么办?第2TC知道我们当前这个大事物现在呢掉了,已经调成了两个小事物,这两个人呢都已经提交了,那接下来结果呢,第三个人给回滚了,接下来TC就命令这两个人呢,也给我回滚。
07:47
所以呢,这就是我们这三者的关系,TM还一个全局事务,然后呢,TC就来协调我们这个全局事务里边牵扯到的各个分支事务,所以我们使用西塔的时候,我们只需要一个注解,就叫global trans,我们全局事物标在我们业务方法上就行了,所以我们最终呢,有了西塔,我们把这个事物呢,我们就可以写一个注解叫格global,哎,我们的全局事物,我们开启了一个全局事物,当然我们现在没有开启C塔,我们现在放在这儿,所以我们现在来看我们西塔怎么用,现在我们这个流程呢,就是这样,然后呢,我们来看,按照他的这个步骤,我们就一步一步往下走了就行,然后他说步骤一,建立数据库,哎,我们现在数据库业务啥都有,但是现在来看步骤二,这是最关键的,我们如果使用C塔at模式,就是o transition自动事物模式,我们要建一个undolo表,Undolo呢,我们翻译过来就叫回滚日志表那。
08:47
这个回滚日志就是我之前干了啥,如果干失败了,我就要回过来,把它呢回到辅到之前的状态,那为什么这一块叫AT10物,就是自动模式,因为这个回滚呢是自动做的,因为我们在这个C塔使用at模式,我们现在默认的情况下,那这个TC呢,只要调一个分支事务,分支事务呢都提交了,这个呢都提交了,假如这个一失败,已提交的这个事务呢,要怎么回滚,那事务没提交是可以回滚的,但是以提交的,我们只能做一个反向补偿,这个反向补偿呢,我们以前如果使用TCC模式,我们自己可以写一段代码,比如我们之前加二了,我们调用我们自己的反向补偿代码给它减二,但是呢,我们现在是自动模式,让用户不用写这个代码,不写这个代码怎么办呢?所以我们就需要一个undolo表,每一个微服务都需要,比如这个微服务在它的数据库里边,除了它正常的业务表以外,它还需要有一个回滚日志表,然后呢?
09:47
那相当于我上一步干了啥,我给这条记录加二了,我在回滚日志里边呢,就来记录一下我给谁谁谁刚才加二了,那如果他都提交成功了,但执行到最后一个的时候,TC又让他回滚,怎么办呢?他没法回滚,只能说恢复以前的状态,我们加二前的状态呢是减二,那我呢就给你再减二,恢复以前的状态,而且这一块呢,它是怎么做的,它是利用直接我们称为叫魔改数据库,哎,相当于有魔法一样,把我们这个数据库直接改掉,比如我们这条加二的记录,原来呢,它的值是八,加二以后呢变成十,结果被人给回滚了,它呢在unlo里边记录了一下们,在这条记录没改变之前,这条记录的值是八,然后呢,如果这个失败回滚了,那他就回过头把我们数据库里边的这个十又改回去,改成八,所以呢,它相当于在我们事物执行之前,他先读取一下这个状态试剂,然后呢,最后再改回来这。
10:47
是它的这种模式,At模式,所以每一个微服务都需要一个undolo表,只要你想参与全局事务,那么现在呢,就把这张表来创建到每一个里边,那么后来呢,可能都需要全局事务好,那现在呢,给WMS里边我们来创一个走来看WMS这一块呢,创建成功们来刷新一下,来在这呢,来直接刷新一下我们的这一块对象浏览器,我们来刷新来看WMS,它呢有一个undolo表没问题,那其他的比如我们扣减积分的这个用户服务,他想做事务,他呢也得有这张unlo表,我们选中它好把这个呢再执行一遍,给每一个里边都执行undolo,这个执行了我们再来选中SMS,好,我们给它执行,我们再来选中PMS给它执行,我们再来选中OMS,给他执行A的命,后台管理系统呢,如果想要了,那也选中给他执行走,我们每一个微服务都加。
11:47
那这个undolog表以后,我们现在来刷新看一下,我们确认一下,好那现在订单服务里边有这个回滚日志表们商品服务里边我们来看也有回滚日志表,那现在呢,相当于我们给每一个里现在都追加上了我们这个回滚日志表,特别是我们的这个用户服务,还有们这个库存服务,好那们现在用C塔的第一步,我们给每一个微服务加入了回滚日志表,在这来记录一下,那现在呢,想用C塔来控制一下我们的这个分布式事务,好那们这个西塔的使用逻辑我们就写在这儿,西塔来控制控西塔控制咱们这个分布式事物,咱们这个逻辑呢,流程是这样的,第一个,每一个为服务,每一个为服务。
12:38
先必须创建咱们这个叫undolo表,诶我们这个回滚日志表,然后呢,接下来第二个我们来看这一块的代码,他怎么说,然后呢,我们接下来他创建自己的业务表,我们现在业务数据什么都有了,接下来它的这一块叫启动服务,然后呢,他要让我们在这个地方下载我们服务器的软件包,这个软件包是什么?他呢,其实是一个CA server,西塔的服务器,这个服务器其实就是这个,我们之前呢,看到有一个全局调控的人,那这个人就是西塔服,这个服务器就是我们说的事物协调器,所以我们来安装这个服务器,就有了我们的这个事物协调器,那么全局的事物协调器,那我们接下来就在这儿来安装,所以我们接下来要做的这个就是安装我们的事物协调器,就是我们的西塔服务器,主要就是我们的这个C塔,So,好,我们来就到这个地址,我们。
13:38
来下载一下西塔服务器CTRLC。来找到这个地址,来来看一下,好这一块呢,C大服务器的列表这呢都有我然后呢,我们接下来,接下来我们就来往下翻,我们就要下载它这块呢,都是一些更新特性的说明,好我现在就来下载我们的这个CTA server,那么现在呢是Windows,我们就下载1.0这个版本来点进来这块呢,我们发现这个是无法连接,因为这是一个国外的这个IP地址,所以我们经常呢有访问不到。
14:09
那我呢,就直接把我们这个C塔服务器的这个地址,这个软件我们就下载好发给大家就行了,大家呢可以打开我们给大家的这一块软件来看一下,我们给大家下载了西塔的三个版本,0.7.1,这是我们CA server,我们当前正在用的西塔版本,还有我们这个1.0,我们现在西塔的最新版本,以及我们这个零点几里边最高的0.9版本。那这个1.0版本呢,跟零点几版本的用法呢,还稍微有点不一样,我们给大家放在这儿,那前置准备的工作呢,那现在就做完了,那这个安装了我们这个CTA server,那么下一个呢,就来启动,那接下来我们就应该做我们剩下的流程,那接下来就来参照这一块的示例,我们只要启动了C塔服务器,那接下来我们就可以来启动测试我们的这一块内容,当那下节课就把我们的整个视力启动起来,来看能不能控制住我们的事物。
我来说两句