00:00
那接下来我们就结合MQ的延时队列完成我们库存的自动解锁功能,整个消息队列的使用流程呢,还是参照我们设计的这个消息队列流程,比如我们这个库存微服务,专门有一个它的库存交换机sto event exchange,如果我们想要解锁库存,应该是这样子的,首先我们库存锁定成功,那这个订单一下成以后,我们库存锁定成功了,锁定成功以后呢,我们就要发一个消息给我们这个交换机,那么这个消息里边的内容就包括的是我们当前是哪个订单,然后呢,他在哪个仓库,哪个商品锁了几个库存,把这个消息呢,我们发给我们的消息队列,然后消息队列的这个交换机,我们看到它呢绑定了两个队列,这个队列呢,一个是按照to release点井这个模糊匹配的路由件来绑的队列,一个是to delete q,这个队列我们第一次呢发我们这个库存锁定成功的消息,我们先使用路由件,叫to lock。
01:01
叫库存锁定了,锁定呢,我们把这个消息发给我们的交换机,交换机呢,然后按照这个路由件,因为它跟这个队列的绑定关系叫stock lock,然后呢,按照路由件先把我们这个消息传递给我们这个延时队列,这个延时队列呢,比如我们延时了50分钟,因订单呢,30分钟以后我们才能知道这个人支付了还是没支付,那我们50分钟以后检查这个订单的库存,比如我们这个库存呢,一旦一成功,我们先发给我们这个延时队列,50分钟以后呢,我们这个性就死了,死性呢,我们重新又交回给我们这个库存的交换机,但我们此时呢,用到路由件叫sto release,然后接下来我们这个交换机收到以后,按照这个路由件正好看到我们这个绑定关系模会匹配跟它是一样的,那我们把这个死信相当于我们锁定库存,这个消息过了50分钟会被路由到我们这个sto releaseto q,那接下来我们所有的解锁库存。
02:01
图,我们就专门来处理我们这个Q里边的消息,只要是我们这个Q里边的消息能到达我们这儿的,都是我们这个库存超时间过来的,所以这是我们的库存的自动解锁功能,那就按照这个功能呢,我们来进行一个编码,那首先我们去我们的整个库存微服务里边,我们先创建出对应的这些队列交换机,以及一些绑定关系。好我们现在来到我们的这个库存服务,想要使用re MQ创建这些交换机,我们先给库存服务里边导入am q PA re MQ的这个场景,Amqp高级消息队列协议的这个starter,好我们现在导进来以后呢,我们来配一下,我们主要在我们的配置文件里边,我们需要配一下我们这个rabbit MQ的服务器地址给我们来配一个rabbit MQ host,它服务器地址们是19216856.10,并且呢,我们再来配上re MQ的v host这个虚拟主机,我们现在默认的都是杠,然后加上我们这个。
03:01
MQ,我们来看re MQ的这个账号密码之类的,我们现在呢已经有了,那么默认呢就不配了,就先来配上这两个,它呢就能直接访问我们的re MQ了,然后再加上re MQ的功能要开启,特别是我们要监听消息,我一定呢来上一个注解,这个注解呢就叫enable rabbit,好把这个注解呢来加上我们这个rabbit MQ就整合好了,整合好以后,接下来我们要跟其他的服务一样,因为我们整个rabbit MQ使用期间,我们的消息都是要以接son的方式来转换的,所以呢,我们来创建一个rabbit MQ的配置MY,比如我们叫rabbit conig,那这个rabbit MQ的配置,我们把之前的这个配置直接复制过来就行,比如之前在订单服务里边。我们配了re MQ的这些消息转换就在这儿,好,我们配一个这个,我们只现在呢默尔只配一个这个消息转换器,这个re MQ里边的这些回调我们先不配,好们先把这个呢,先最简单的先复制过来,后来呢再来加上这个功能来到我们这个库存服务里边,好my rabbit,我们现在呢,加上我们的序列化机制以后rabbit MQ里边发的所有消息都是杰森的接收,也是以杰森方式来进行接收。
04:19
这块配好以后,我们再来加上铸解我们re MQ的基本环境就配好了,再来加上我们要使用这些交换机队列和绑定关系,再来把这些我们也来配上,来到conf rabbit config里边,现在最简单的方式方式,我们加交换机呢,直接给我们容器中放一个exchange这个交换机就行了,我们是这个核心包的exchange,好来放一个交换机就行了。那么现在要创建哪个交换机,我们参照我们的文档,先来创建第一个库存微服务自己的交换机叫to event exchange好,我们准备来创建一个这个交换机,我们名字呢,就叫to event的exchange,把这个交换机先创建出来,那给容器中呢,加一个这个交换机,好,At b,这是我们。
05:10
库存服务的默认交换机,这个交换机的名字我们就有一个,我们现在交换机呢,全部使用topic类型,你会发现呢,我们这个交换机要绑定多个队列,而且要不同的路由件,还有模糊匹配功能,所以我们现在呢,全部使用我们的topic类型的交换机topic exchange来创建出来,创建交换机的时候需要这些参数来准备好。好,我们把这个最复杂的这一系列参数我们复制过来,CTRLC。我们来创建第一个topic交换机,首先交换机的名字,那按照我们这个文档,我们这个交换机名字叫to event exchange,那么就拉过来把这一块的换行符来去掉。这个换行符也来去掉好,交换机的名字制定好了,然后呢,交换机是否持久化的写一个处,是否自动删除的写一个false,好,那我们这个交换机准备好以后,给容器中一放,OK,我们第一个交换机准备好了,接下来我们库存为服务呢,还得准备我们两个队列,好接下来再来创建两个队列,Public队列呢,是Q好,我们创建第一个队列,按照它的名字我们叫to releaseto q好,第一个队列,那么就来加过来to release。
06:29
To q。好,把这个队列呢加过来,Return,我们要创建一个队列,那就拗一个Q,那么这个Q呢,是amqp核心包里边的点过来,那我们这个Q里边要用的内容我们直接复制过来。它呢,现在要这么多的参数,那么在这来进行一个创建,第一个参数sto release sto q,这个队列呢,是一个非常普通的队列,那么现在呢,就来设置它的name,就叫sto releaseto q crl c复制过来,这是它的名字,然后呢,它是否持久化的来写一个触,然后呢,是否自动删除的,我们来写一个false,然我们现在呢,第二个叫是否排他的,现在只能有一个人连,我们来写一个false,很多人都能连,但是消息呢,谁抢到算谁的,接下来还有一个布,我们是否自动删除,我们来写一个false,然后还有他的这些参数,我们现在是一个普通队列,我们也不用设置什么参数,好这个队列呢,我也来创建好at b队列创建好以后呢,我们再来创建一个,接下来还有一个队列叫to delay这个Q,这个Q呢是一个延迟队列,就来写一个public q它呢是一个延迟队列。
07:48
好,那么现在呢,延迟对列。那我们延迟队列呢?Return,你有一个Q,这个Q的普通内容我们还是先创建出来,先是我们Q的名字,按照我们这个文档,它叫to q。
08:03
好CTRLC,然后呢,接下来它是持久化的,它是排它的,非排它的,然后呢是非自动删除的,并且呢,由于我们是一个延迟队列,延迟队列呢就有一些特性,我们按照我们图的这一块,应该是我们消息呢先库存锁定成功,先发给延时队列,等消息一过期以后,按照这个路由件要路由过来,所我们这块呢,要配置消息的过期时间,还有死性路由,死性交换机,这我们都得配置好,好那么现在的这些参数我们就来参照以前我们在订单服务里边我们配过这些参数,直接把这三个要用的参数我来复制过来。CTRLC好,来到这儿,我们延迟队列呢,主要来配这三个参数,CTRLC来准备一下,那就是我们这三个参数,这三个参数分别代表我们这个死性路由,信死了以后交给哪个交换机,然后呢,还有我们这个信死了交换机要用的这个路由件,还有我们这个消息的过期时间,他们呢全部是在一个map里边封装着来写一个strip object的这个map好,现在呢就叫as是什么的,这参数有一个哈西麦来准备好这几个参数。
09:18
我们把这个二呢放进去,我们来的第一个参数点,一个put,好,一个叫X de letter exchange,我们这个死性的交换机CTRLC复制过来。然后呢,我们这个信死了交给哪看到我们这个图示,这个信死了呢,应该交给我们这个默认的交换机,就是我们库存微服务的这个交换机,怎么信死了是交给我们上边的这个交换机CTRLC。那信死了交给我们这个交换机,我们指定了信死了还交给库存的交换机啊,第一个接下来X点一个put,然后信死了用的路由件是什么?CTRLC来复制过来,来看一下我们的图示,我们这个信了交出去用的路由件叫to release,好,我们就按照这个路由件。
10:07
我们把它呢交出去,再接下来我们这个消息的过期时间,我们来点一个put消息过期时间,X message t TL t TL,好,我们现在过期时间呢,那先来默认设置,来给它设置上一个12万这个毫秒,那就是呢两分钟,因为以前这个订单的定时关单,我们在这测试的时候呢,订单是一分钟,我们在测试期间。就给我们这个库存服务先整一个两分钟,后来我们来说一下它的整个流程,好我们这个两分钟呢,先准备在这,我们相当于死性队列的这一块调整,我们就调整好了,你接下来把这三个内容全部呢放在这儿,这就是一个特殊的延时队列,队列里边的性呢,时间到了都是死性,然后呢会交出去,然后我们这个延时队列也创建好了,这两个都创建好了,接下来我们得创建交换机跟这些队列的绑定关系,好我们再来创建两个绑定关系,Public来写一个帮顶,我们第一个绑定关系是我们这个叫我们按照这个绑定关系叫to lock的绑定关系。
11:17
那库存锁定的这个绑定关系,好,那现在呢就叫帮顶,那么这个绑定关系呢,就直接扭过来,扭一个帮顶创建了一个绑定关系,绑定关系里边要用的所有内容,好我们来复制过来,现在呢,把这些所有要用的参数CTRLC来准备一下这些参数。绑定关系里边第一个是目的地,目的地然后呢,相当于是把我们这个交换机和我们指定的这个目的地来进行绑定。那现在绑定关系是把我们这个交换机要进行绑定,所以我们现在呢,交换机还写它原来的to event交换机,我们相当于呢,我们这个绑定的是什么?我们现在是将这个交换机跟我们哪个绑定,我们现在呢挨个来绑定,我们先将交换机跟这个队列绑定好,那现在呢,交换机先跟第一个队列叫sto releaseto q跟这个非常普通的队列,我们先来进行绑定好,交换机跟它绑定,它们呢是一个队列,所以绑定里边的这个类型destination type,那就是一个队列点过来。
12:28
点一个它是一个队列,好,我们交换机呢先跟队列来进行绑定,这个交换机呢先跟第一个队列绑定,然后呢,用的路由件叫什么好,我们现在来看这个交换机跟第一个队列绑定用的路由键叫sto release,还有一个这个井号CTRLC我们复制过来,好就叫它,然后呢,接下来我们这这一块的所有参数内容就直接来写一个捺好我们第一个绑定关系就创建好了,按它be,这是我们跟第一个普通队列的绑定关系加跟第二个延时队列的绑定关系,再把这个呢复制过来,那现在呢,这一块的绑定我们就叫to lock的绑定,好我们第一个呢是to release绑,那么这个呢是更我们这个。
13:17
普通队列这个release队列的绑定,然后呢,接下来是to lock的绑定,然后呢,我们接下来的这个绑定,我们将交换机要跟它进行绑定,所以我们的目的地我们先来填我们这个队列的名字,我们复制过来,把这个队列的名字呢,我们来填到我们的目的地是在这儿走,我目的地这一块呢,你就来删掉。现在我们是这个交换机跟我们这个队列绑定,绑定用的这个路由件,我们叫to lock,好,所以我们现在用的路由件叫斯to克lock,把这个绑定关系呢,也放在容器中,那这样一个交换机两个队列,两个绑定关系,那现在呢就创建成功了,那现在来启动一下我们的这个库存服务,那所有服务呢,顺便都来启动一下,那么现在呢,是网关会员服务,包括我们的订单商品服务,库存服务,第三方服务,包括我们商品的检索服务,还有我们这个购物车服务,以及我们这个认证,我们登录注册的这个认证中心服务,把他们呢都启动起来走。
14:21
来等待他们的这个启动结果,那我们看到呢,这一块有我们启动失败的服务,比如网关,网关这一块的整个失败原因,他说他这个找不到什么类,我们一会儿再看,那这还有一个会员服务,这个启动失败,这个失败呢,好像还是一个原因,诶这个原因他他说这个全局事务的配置异常,对了,我们以前呢,为了使用分布式事务,我们将分布式事务这个西塔导到了common里边,这样呢,相当于其他所有服务都导了西塔,但是导了西塔呢,他们却又没配西塔的信息,要配西塔的信息,必须把这两个配置文件都放进微服务里边,所以呢,他们导致我们这一块呢,全部启动报错,那这样我们让每一个不使用分布式事物的人,全部把这个西塔这块呢,排除掉这个依赖呢,我们让它排除掉CTRLC,好,我们现在就来找一下,我们将每一个不使用分布式事务的,那接下来我们这个现在认证服务器,我们现在呢,目前不使用排除的第一个。
15:22
什么的,这个start我再来排除,排除我们的这个C,我们认证服务器呢,我们排除掉购物车,我们也来排除掉购物车,在这来看一下common服务里边们除了dependency,我们还要exlousion来排除,排除我们的里边的这个西塔分布式事务,好我们购物车也排除了,再来加上我们的这个优惠服务,好卡在这一块呢,我们来导了to都来挨个排除。那现在呢,叫exclusion exclusion好,排除我们这个西塔。包括我们的网关点进来,来到common里边来也给他排除,四排除网关排除完了以后呢,还有我们的这个会员服务,那现在呢,先给它排除,那现在所有的分布式事务,那说呢,最好用我们的最终一致性,它能兼容我们的高并发,好我们现在会员也拍了这个订单和库存,我们先留在这儿,既然两个配呢,我们就留在这儿,我们这个商品服务,我们也可以给他拍掉商品服务来到这dependency是exclion,我们来给它exclion来排掉我们的西塔分布式事务。
16:33
以及我们的检索服务,检索服务呢,这一块也一样,检索服务呢,来给它排掉我们的C塔分布式事务,还有我们的。其他这三个就不测了,我们的第三方服务我们也来排一下。Exclloion啊,排一下西塔的分布式事务,以及我们的这个库存,我们就不排了,包括我们这个后台的人人fast这个项目,我们由于没有依赖自个的common,诶这也依赖了,那我们也可以给他排一下exclusion exclusion我们的这个西塔项目,好我们也排了,然后呢,包括含。
17:10
我们这个代码生成器之类的,这个我们就不排了,好现在呢,我们把这些排了以后来重启一下我们指定的其他项目。网关这些都没启动,包括我们商品这些我们都没启动,让它启动起来,我们来等待一下这一块的启动结果,那么现在呢,主要来看一下我们这个re MQ里边,我们创建的这些指定的队列有没有好,我们使用这个账号密码来登录。进来,我们先来看我们的队列,我们除了有这个订单的这个队列,我们这个库存服务只要提起来,那还会有库存的队列,包括这个交换机,只要库存服务提起来,还有库存的交换机,来稍等一下来看,诶,我发现这个库存服务呢,其实早都提起来了,但是我们发现呢,它没有创建出这些队列和交换机,实际上我们这一块库存的代码,我们来打开给大家看一下。
18:02
我们库存让他创建队列交换机的代码在这,我们库存服务呢,在这,我们让他呢按B给容器中放了非常多的这些队列和交换机,那为什么我们在这一块呢没有启动,这个原因呢,是我们找的这个rabbit MQ,它的什么时候会创建这些队列和交换机,是我们第一次连上rabbit MQ,比如来监听消息的时候,他发现呢,这些东西呢都没有,他呢就会创建上来,所以假设那现在随便来写上一个方法,就来让他监听一个消息,它呢就会自动把这些都创建好,比如呢,就叫handle,这个handle。一个我们来写一个rabbit listener,我现在来监听消息,监听哪个队列里边的消息,我们随便指定上一个队列,比如就来监听库存的这个释放队列里边的这个消息,然后呢,我们把将所有的消息message那可以拿过来啊。有消息来了,我们可以在这打印,当然我们可以不用处理,现在呢,我们再来启动我们的库存服务走。
19:04
那它呢,这一块就会自动创建来稍等,也就是说我们这个第一次连上我们这个消息队列来监听消息的时候,这没有的组件呢,它都会创建,那稍等一下我们库存服务的启动,好,我们现在看到呢,这些库存服务全部启动起来了,我们再来我们的re MQ里边,我们发现呢,库存的两个队列,一个延时队列,一个释放库存的队列,包含了库存的这个交换机to event exchange也都起来了,那就没问题。那下节课呢,我们就来编写代码,完成我们整个库存的自动解锁功能,先把环境都搭建起来,包括这个商品服务也让它呢启动起来,这块商品服务呢,提示我们这个包不存在,因为我们都把这个西塔给它排除掉了,好,我们就把它去除掉,包括我们来看一下哪一块用了我们这个西塔,分布式事务。好,这一块呢就没有了,我们先来重新启动我们的商品服务,好我们这一块呢,服务就启动成功,我们整个环境呢,就先来搭建好,特别是我们这个库存服里边要创建的这些消息队列和交换机,那最终呢,一定要确认在这一块呢创建出来,那么下一个呢,再来编写库存的自动解锁代码。
我来说两句