00:00
前面我们准备好了西塔的环境,我们为每一个服务创建了undolo表,以及我们下载了C塔的服务器,那接下来我们就来看如何为我们的订单服务添加上我们的分布式事务,那么现在呢,就来看一下我们的整合步骤,我们整个的完整步骤那应该是这样子的,首先第一步那使用西塔肯定得导入依赖,那么这个依赖呢,我们先来导入,由于我们好多服务都要用到分布式事务,所以我们直接在common里边来导入我们这个西塔的这个依赖,西塔依赖呢,以前导了spring cloud,阿里巴巴NAS相关的东西,那么接下来再来导西塔,那按照它起名的这一块规则,能考虑西塔呢,可能名字叫spring cloud start阿里巴巴西塔这呢是阿里巴巴的这个组件,诶确实有我们这个组件,而且呢,我们这个西塔一导以后大家注意,那么现在呢,导入的依赖是我们这个场景啊,是我们这个依赖,然后呢,我们这个依赖里边,它会为我们导入我们这一块来看。
01:00
我们搜一下我们西塔,只要我们导了这个西塔,它就会导入spring cloud的阿里巴巴这个西塔,那有了这个导入,它肯定对我们C塔呢,都做了好多的自动配置,比如我们这就有一个全局事物的自动配置,所以我们这一块呢,自动配好我们其实就能用了,但是我们再来看一个我们这个西塔里边,它除了导这个,我们还导了一个叫西塔O,这个西塔O的版本呢,是0.7.1,所以呢,我们来注意一下这一块的版本,因为我们接下来要使用C塔第一步导入依赖以后,接下来第二步我们就得参照我们的视例代码,我们继续来进行它,我们来启动我们的这个C塔服务器,我们来启动我们这个C塔服务器,因为这个西塔服务器呢,我们都知道它是我们在分式事务里边的这个协调器,就是这个TC,所以我们想要做分布式事务,我们全局得启动一个TC,我们启动这个c server解压并启动,那我们现在就来找一个,找哪个CA server一定注意我。
02:00
咱们西塔的版本是071,我们就找C塔SERVE071版本,所以我们之前呢,下载了非常多的这个C塔版本点进来,那现在呢就使用071,每一个版本的使用就稍微有点不一样,配置上稍微有点变化,把这个071呢,来拿过来,我们把它直接解压过来们打开这个压缩包先看一下,好这一块呢,都是零散的文件,那么就直接解压到我们这个文件夹,那现在呢,解压到我们这个CTA server这个071,我现在把这个压缩包它删掉,那我们这个C塔server就准备好了,接下来我们想要启动,其实我们直接在这儿直接启动就行了,但是启动之前呢,我们可以看一下它里边有一些config,一般呢,这就是我们C塔里边的配置,配置里边呢,有一个叫DB store,这是我们这个数据库的circle,相当于它呢,让我们来创建一些表关系这呢,有一些表的创建,我们先放在这,我们也不知道这个表是干嘛的,然后呢,再来看能写的两个配置,一个叫fair com,一个叫registry con。
03:00
这那这些都是什么,把这一块呢复制过来,Registry com来说一下,在car so里边registry com翻译过来,这就叫注册中心相关的配置,那我们就来看一下这一块要配什么,在car server里边来点进。com来registry com点进来,那么在这里关呢,我们看到一开始呢有一个叫regry,就是我们这个注册中心,然后呢,Type写了一个fair,就是我们现在呢C塔支持非常多种版本的注册中心,相当于我们C塔服务器,就是这个C塔,So本身也想把它自己注册到注册中心里边去,如果我们用的是这些版本的注册中心,那typeb呢,就指定这些就行了,而我们现在呢用的是nacos,那么就可以来直接指定nacos,然后在这一块指定我们这个NAS的地址,我们就是本机的local host8848,这是我们NAS的地址,剩下的呢,我们也都不用变,那这一块呢,我们指定了注册中心,那接下来其他版本呢。
04:00
注册中心我们在这只要TYPE1改,就来改对应的版本这些信息就行了,那完了以后呢,还有一个confic confic代表我们这个C塔里边的配置,配置是用什么做的,配置呢?它其实兼容使用文件来做,也兼容把我们C塔服务器里边的所有配置都放在我们的配置中心,配置中心呢,比如我们用了nacos,包括我们这个注册中心,如果我们这个注册中心以前用fair,用文件模式的话,那这些注册信息文件模式呢,就全写在了一个fair conic里边,那我们正好看到呢,C塔serve这里边有一个fair conic,其实就是配置我们C塔里边的一些注册信息,我们先指定了注册中心,那这一块呢,就是指定注册中心,我们C塔本身要指注册到哪一块,再来加上我们下边con,就是C塔的配置,CTA的配置都在哪,C塔的配置都在哪里,那么现在呢,默认只在这里边来修改了一个我们这个注册。
05:00
的中心的配置。这一块,然后呢,我们把它这一块呢,Type让它等于NAS,并指定了相关的配置,然后我们再来看这个registry里边说我们这个西塔的配置,相当于把西塔服务器本身所有的配置,我们都可以配到我们的这些配置中心,比如我们来用nacos,当然我们也可以让文件来配置,所以我们现在呢,默认西塔的所有配置都在一个文件,叫菲con,所以我们现在看到了,其实这个方菲尔con就是西塔的整个配置信息,这块配置信息呢,大家完全可以全部搬家放到配置中心里边,所以我们在注册信息这一块呢,我们指定好了,我们整个配置都在哪儿,包括他自己注册到哪,然后呢,我们现在默认配置呢,我也不给配置中心放了,我就让他用文件的方式来配,那文件的方式来配呢,我们来看一下这个菲尔com点进来这块呢,就是C塔的这些配置,比如它的一些传输配置,用什么传输协议,我们这个TCP,包括我们服务端的这个。
06:02
模式是NIO,以及我们这个是否有心跳等各种机制,以及线程工厂,这其实就是对西塔服务器的一些配置,完了以后呢,还有一些service这块,我们后来再说,还有我们一些客户端的配置,包括呢,我们这还有一个这叫store store呢叫存储,它这块呢注释叫transition log store就是我们这个事物日志,事务日志存储在哪里,存储在哪里,然后呢,我们现在看默认呢,它也支持这两种模式,第一种将所有的日志存储在文件里边,第二种存储到我们这个DB里边,如果存到文件里边,文件的目录名字叫什么,我们在这一块呢都可以配置,包括文件这些大小等等,然后呢,如果是存在DB里边,大家看,如果我们相当于将事物日志,我们现在是一个全局日志,TC里边肯定存的是全局日志,如果我们存在了数据库,大家注意数据库这一块呢,那我们就要指定我们数据库的地址,包括我们数据库的账号,密码,特。
07:03
别注意我们数据库里面的三张表,Global table branch table以及lock table,就是我们全局的这个表,以及我们分支事物的表,还有我们所的这些表,那这些表呢,我们怎么知道这些表的结构是什么呀?我们之前就看到DB store这里边呢,就是三张表的结构,那现在呢,我们也就不将全局的这个事务信息存到这个DB里边了,太麻烦了,那现在呢,就直接让他用费尔来做,把这个信息呢直接存到我们一个文件里边就行了,好,那现在呢,至此我们就全部配完了,我们只改了一下注册中心,那我们这个c server里边只改一下注册中心的配置,那么这个c server呢,我们就可以启动了,那接下来启动一下C塔的server,当然启动之前,因为我们自己都要注册到注册中心,那先得保证我们的NAS现在是启动的,那现在S呢都在启动,包括我们现在所有的服务,那也都是启动的,因为他们也都要注册到注册中心里边,那么现在再来启动我们的cso走,那现在Windows呢,直接。
08:03
利用它的bet我们直接双击启动,那如果我们的c server启动成功,来看一下它的这一块控制台来稍等一下,好,这一块呢,Server started,如果这一块我们的服务启动成功,那理所应当在我们注册中心就能看到我们的C塔服务器来看一下,那注册中心NAS来刷新,我们得重新登录一下NAS,好,NAS来登录进来以后呢,我们看一下服务列表,服务列表呢,我们发现除了有我们自己古力mail的这些服务外,多了一个叫server a DR,这个呢,其实就是C卡服务器的这个名字,只不过这个名字起的挺怪的,Server ad DR大家想改呢,也可以在我们这些配置里边,配置文件里边来进行修改,大具体的修改都可以参照官方文档,好,现在呢,让我们的C塔服务器就启动起来了,那我们做的前两步首先导入了西塔依赖,然后呢,我们启动了C塔服务器,接下来我们再来看第三步,第三。
09:03
我们要开全局事务怎么做?们按照我们以前的这一块代码,我们说西塔的这一块,说我们如何来开一个全局事务,往下它的整个分布式事务是这么来做的,只需要给我们业务上标注一个global transitional,就是叫全局事务,我们现在呢,结账这个这个下单,它呢是一个全局事物,所以呢,我们现在给它标一个注解叫g global。Global transitional,我们标一个叫全局事物,那么就能应用到我们西塔的事物了,好,我们标一个它我们点进这个全局事物,它里边呢也有事物的一些属性设置,比如事物的超时,哪些异常回滚,哪些不回滚等等,这是我们的全局事物标上一个这个注解,当然我们这个小方法自个也得是一个事物,我们也标了这个注解,然后接下来标了这个就完了吗?我们再来看我们的文档,我们按照文档呢,这几步都做了,表也创建了,服务器也启动了,事物也启动了,然后呢,它的步骤我们启动各个服务来运行示例,而且呢,它这也有相关的示例,我们可以打开看一下,来看一下这块的事例有没有相关的指导,我们来往下翻,这块呢,它有跟各种场景整合的事例,比如我们整合了double的满的。
10:19
我们可以看买贝利斯的这一块文档,或者GPA这一块呢都行,你点进来,那现在来看我们这一块的C塔该怎么用,这一块呢,也有这个实例导入我们这个数据库,我们现在业务都写好了,C server我们也启动了,然后呢,创建这些各个服务我也都整好了,然后接下来看下边它要注意,注意要注入一个叫data source proxy,这是西塔的代理数据源,现在西塔想要控制住事物,得把你自己默认的数据源让西塔一包装,让西塔代理你的数据源,西塔呢才能控事物。所以接下来我们要做的第二步大操作,也就是说第三步我们核心的大操作就是每一个微服务,因为现在呢,整个分布式事务牵扯到很多微服务,所有想要用到微服务的分布式事务,所有想要用到微服务的分布式事务,所有想要用到这个分布式事务的微服务,所有想要用到这个分布式事务的这个。
11:20
服务都应该呢,使用西塔代理他的数据源,使用咱们这个C塔的这个数据源代理。Data source proxy代理自己的数据源,所以这一块怎么代理呢?他也给我们了一个文档,把你原来的这个数据源你可以呢拿过来,或者你给容器中配一个原来的数据源,然后呢,把这个数据源再通过我们这种方式注入进来,注入以后呢,我们再把我们的这个代理过的数据源作为一个主数据源,但这个配置呢,在我们这个低版本的boot里边写起来能用,然后我们BOOT2以后这块容易产生我们的循环引用异常,那么来看我们这一块该怎么写,那么现在要代领我们的数据源来点开来写成我们自己的这个配置,我们自己的配置呢,我们全放在,我们现在呢是一个数据源相关的配置,比如我们现在就来加一个配置文件叫MY西a config,我们的这个西塔配置,我们现在想要让西塔代理数据源,那怎么带,我们先来按configuration,这是一个配置类,好,然后我们来看一下我们默认数。
12:28
据源的这个配置,默认我们的数据源呢,是叫data source auto configuration,我们数据源的自动配置,那在我们这个数据源的自动配置里边呢,我们来往下翻,它呢会为我们来导入一些数据源,包括我们来主要看这import import就是来导入一些配置,比如导入我们数据源的配置叫黑carry,我们现在呢,Spring boot默认用的就是这个数据源,所以相当于我们会导入这个数据源,我们来点进来看一下,Boot呢,这块是这么来导入的,他说我们这个数据源想要用呢,是这么来用。
13:02
它呢,先有一个configuration,这是一个配置,然后呢,它会给容器中来看来配置这个conor的时候,它会at being,相当于给容器中添一个组件,这个组件呢,就是我们这个数据源,那么这个数据源呢,所有配置都是跟这一块绑定的,也跟默认的data source properties跟我们这一块来进行绑定,如果我们自己在给这配数据源,相当于我们自己写一个方法来写一个data source的话,如果我们at b这一块呢,就会有这么一个问题,大家来看人家配的数据源,在这at being的时候,人家说了一句话加conditional on missing being,就是我们容器中没有我们自个配的数据源的时候,我们呢,才会启动这段代码配置给我们来配这个数据源,那前提是我们导入了黑瑞的这个类,那现在默认呢就已经导了它了,所以我们现在呢,如果我们自己给容器中配了这个数据源,那就没有了,所以我们现在我们的数据源就应该这。
14:02
来配,怎么配呢?我先来return一个,那我呢还是把我们数据源,我们数据源所有的这个绑定都绑定的是这个data source properties,而且这个data source properties我们来看data sourcefiguration,我们数据源的这一块配置,主要看数据源的自动配置data source auto,那数据源的自动配置就是我们只要有数据源了,它就开启我们数据源的自动配置,而且呢,开启了我们这个data source properties enable,相当于它开启了我们这个属性绑定,相当我们容器中就有它了,所以我们想要配置自己的数据源,因为我们容器中配置的数据源的属性都在我们这个data source properties里边封装着,所以我们把容器里边的data source properties先拿过来,我们直接owa,我们把这个拿来以后呢,数据源的所有配置,连接地址等等都在这,然后呢,我们希望根据它,我们自个儿来创建一个数据源,那怎么创建呢?我们可以来参照我们这一块的。
15:02
代码大家注意一下我们之前创建数据源的这个代码,那在这个data source configuration里边能看到它在下边按be给我们容器中加这个hi这个数据源的时候,它呢会调用的是这个create data source方法,点进来,然后呢,我们会发现它其实就是调到我们这个properties的这个initialize data source build,然后指定一个type,再进行build,它调的是这个方法,那么就来直接自个把这个方法一调就行了,我们直接让这个data source properties data source properties来看,人家是调这个,我们把这个直接往过一抄,点一个initial data source这个build,然后呢,我们来指定一个type类型,类型呢我们现在是这个he carry,这个data source,我就来指定成它,那构建这么一个数据源,然后呢再来调用build,把这个数据源呢,得到这是我们得到的这个数据源,然后我们来看人家得到数据源以后还做了什么点过来。
16:02
呃,我们来到下边这一块呢,只要create了data source创建完了以后,人家还判断我们这个里边有没有name,还有name,还要设置这个name,那我们就直接把这段代码呢,它之前咋创建的,我们再调一遍就行了,所以我们在这呢手动来创建一遍,如果说我们的这个properties里边走我们的这个data source properties里边,然后呢,有这个name,我们就设置一个这个data source的什么铺name,然后我们这个源就准备好了,但是我们这个数据源要被西塔包装,所以我们现在拗一个西塔的这个呢叫data source proxy,我们呢创建一个大家注意这是IC塔RM的这个data source,我们是用这个代理把我们原来的数据源一包装,那一包装以后,我们的这个数据源呢,就自定义的数据源就放进去了,那我们这一个服务是这么自定义数据源的,其他服务都一样,那么除了订单服。
17:02
外,那们还有我们的库存服务,主要是这两个想参与分布式事务,那么就来到这个库存服务,我们也给他配一个C塔的代理数据源,好来到这儿,我们直接在他的MY菲斯convi里边来进行一个配置,点一个OK,我们把他的这个代理数据源都配好,配好以后呢,来看还有没有什么要做的,然后他说下边fair conf f什么什么要与什么什么一致,所以大家会发现我们这儿还有一个fair con f,它是在我们当前这个里边说的,我们现在来点进它随便的某一个代码里边,大家来注意,那们在这个代码里边呢,看一下它这块resource里边会发现呢,我们这个fair conflictic registry conflict,它呢还在这里边有,相当于我们每一个微服务都得把这两个也都复制进去,所以现在我们要做的是在我们每一个微服务,那现在呢,数据源自己代理好了,接下来自第四步,每个微服务。
18:02
一个微服务都必须呢,导入我们这个叫fair confic和我们的registry confic,所以呢,我们这个服务器的这个fair conf,这个东西呢,其实就是之前的模板,我们直接把这个模板呢,CTRLC给这一复制就行了,好每一个服务呢,这两个东西都得导,那现在呢,给我们这个订单服务导了每一个微服务,把这两个一个registry conflict,一个是fair conflict,然后呢,这两个什么都不用变,但是呢们得导进来CTRLC,然后呢,我们现在给我们订单服务我也来导进来,那每一个服务都导进来以后,真的什么都不变吗?来看一下下边的说法,下边呢,在这一块我们是这么来说的,我们回到代码之前的这一块逻辑,他说。在下边他说fair con的这个service v group map配置呢,必须和application name一致,相当于我们当前应用的名一致,因为他是这样说的,他在我们这个西塔的这个阿里巴巴西塔的这个start里边,他的这个默认的全局事物配置类中,会使用我们当前应用的名字杠一个physical卡service group作为我们的服务名注册到C卡server上,如果我们这个配置文件里边的跟我们这个不一样。
19:23
那我们就连不上我们这个C塔server,它就说连不上的问题,所以相当于每一个这一块的这个file,它里边有一个v group,就是这个相当于我们是一个分组。因为我们每一个小事物,分支事物,他们自己呢,也要注册到我们的TC里边,他注册用的这个名字,那就是这一块我们要指定用的是什么呢?就是当前应用的名字,按照人家官方的说法是当前应用的名字,然后呢,加上一个杠physic这个group,好把这一块呢复制过来,加上一个它这是我们的这一款名字,每一个微服务都不一样,这是我们订单的,还有我们的库存的点过来,来到库存的们来点进他的费,那他的费呢,来到v group里边也一样是我们这个鼓励面,我们的库存的,然后呢,再来杠一个,杠一个什么呢?我们现在加上它的这个physical service group,好,我们现在这两个都加上以后呢才行,包括人家说如果我们不写这儿那也行,那我们可能写一个这样的配置,他说在我们这个阿里巴巴这个全局事务配置里边会。
20:36
有我们这么一个配置叫spring cloud,阿里巴巴C塔TX group,来给大家示范一下,我们直接来写一个C塔,那这一块呢,就有提示TX service group,我们事务的服务分组,服务分组呢,原来我们的这个服务分组这块呢,是写一个我们这个应用的名加一个PH group,如果我们现在自己想改了,那么在这写什么,那以后就是什么了,所以两处改,要么改这,要么我们改费,那么现在呢,费都改好了以后,那订单服务和我们的库存服务,现在呢,这两个相当于就好了,只是在我们的这个费con里边把这个v group都一改就行了。好把这一块呢,这是我们第四步,V group,这是我们当前应用的名字application name,点一个name,好,我们把这块呢都改好以后,我接下来直接来启动测试,我们看行不行,来启动测试我们这个。
21:36
分布式事物,当然想要加分布式事物的核心就是我们给这个订单方法来看这个older service,我们订单这一块呢,想要做一个分布式事务,们在方法的一开头标一个我们是一个全局事务,接下来我们远程调的这个库存服务,它不用标全局事物,因为它是一个分支事物,所以呢,它自个儿用这个小喘C就行了,所以们现在呢,第六步核心就是呢,给我们这个分布式大事务的入口,入口我们来标注,标注我们这个全局事物,然后呢,每一个远程的小事物,每一个每一个远程的小事物,用我们这个喘塞呢就可以完成了,好。
22:28
那接下来我们来看能不能我们现在就来启动一下我们的订单服务和我们的库存服务,好我们现在来启动他们两个,他们两个呢,我们现在为他们加入了分布式事务们启动了C塔serve,在这启动了C塔serve,然后呢,每一个人我们也都配了让C塔代理他的数据源,并且呢,在费里边指定了它的这些分组,那接下来我们来看一下效果。好,我们来等待我们的整个启动过程,好,我们现在呢,这两个服务我们都启动起来了,只要报的NAS这些问题我们都不用管,因为我们的配置中心没启用好,下面这两个服务启用起来以后,接下来测试一下分布式事务,那以前我们的订单是这样子的,如果我们在下边我们写了一个处理异常,那就会出现我们订单回滚了,因为在订单这一块它异常自己回滚了,但是我们的库存没回滚,因为库存是一个远程服务,已经执行了,所以呢,接下来我们来看能不能两个都回滚,那现在来到我们的这个订单结算方法,我们先来刷新,先保证呢,我们现在是登录状态。
23:33
好,没有登录,我们现在来登录一下,那第一次启动呢,它经常会远程超时,我们就来重新刷新,再来登录一下,走好,现在我们这一块登录成功,那接下来我们就在这儿来测试一下,那现在来进行结算,那我们现在来到结算页以后呢,我们就来结算这两个商品,那都来看一下这些库存,原来我们这两个商品呢,一号二号他们的库存呢,都是二,而且我们来看订单,现在订单呢,默认只有一个订单,那如果我们分布式是否成功,我们在这儿下单一失败以后呢,应该库存订单都回滚,我们来测试一下,我点一个提交订单,好,订单提交来到我们这个页面,说明失败了,失败我们先来看订单,订单刷新它没有,这是肯定的,然后主要来看我们的库存,来到我们库存这一块,库存点进来,诶我们发现呢,库存这一块呢,并没有变成三,所以我们现在呢,锁定库存也就回滚了,因为我们有了C塔,我们的分布式是不就空起来了,那如果没有C塔。
24:33
我们取消掉这个全局事务,再来测一下,好把这个全局事务一取消以后,我们重新启动订单和库存服务走,那这样呢,又会出现我们的情况,订单没下,订单表里边没数据,但是呢,我们库存锁定会增加,我们看一下是不是这样。好,我们现在呢,这两个服务我们又都启动成功来测试一下。我们先来刷新一下我们的结算页,来到我们这一块结算页我们来看我们现在没有加全局事务的效果,我们虽然用了C塔,但是没有标注全局事务注解,来测试能不能有分布式事务来提交订单,提交之前我们再来确认一下,在数据库里边库存锁定呢是二,然后订单呢只有一个,如果我们一提交走。
25:17
然后我们这一块订单会失败,失败以后呢,我们来看库存刷新,诶库存呢增了一个,那这一块呢,订单却没有添加,我点进来订单没有添加,所以没有C塔的话呢,我们就控不住这个分布式事务,那有了以后,那想要控直接来加上一个注解就完事了,那这就是我们使用西塔来演示了一下分布式事务的解决也非常简单,配置整个一岛西塔服务器一起一个注解搞定,大家下边呢可以来测试一下,当然西塔的这些详细使用,大家都可以来参照我们周阳老师讲的spring cloud阿里巴巴。
我来说两句