00:00
我们继续来编写秒杀成功以后的快速下单,那们在这呢准备了一个订单号,接下来我们把这个订单消息直接发给re美MQ就行了,那由订单服务器来监听,怎么最终呢就应该是这个样子,那消息队列里边只要我们这个秒杀服务,我们快速这个订单创建成功,那就呢,使用这个路由件给我们这个交换机来发一个消息,这个交换机就是我们之前的订单交换机,这个交换机呢来绑定一个队列,那订单服务来监听这个队列里边的内容,给我们来后台慢慢创建订单,所以这个队列呢,它最大的作用就是来做一个流量的消分,而不是每一个请求都过来实时调用我们的订单服务,好,我们现在就来执行我们这一块的功能,我们先来引入re MQ放到我们这个项目里边,好,我们来写一个depend am qp am qp的这个start我们现在已引入进来,把control y它删掉,然后我们来配一下rabbit MQ的一些信息。首先是我们这个。
01:00
啊,Rabbit的we host这个信息,那现在要连的虚拟主机是杠,包括我们这个rabbit的主机地址信息,那就是192.16 8.56.10,然后剩下的东西呢,那都是默认配置就行了,比如这个端口之类的,包括账号密码,而且如果我们要做可靠消息呢,一定要开启我们这个发送者的这个确认模式,以及我们接收者的这个回调模式,那这个呢,我们现在就不做那么多了,我们以前订单服务呢,都说过,大家想要引入呢,就直接来引就行了,那么这一块做好以后,接下来我们给rabbit MQ里边发消息,我们就来创建一个rabbit的配置类,我呢直接把以前的这个配置类拿来,主要是我们发消息呢,我们使用杰森来传输数据的,所以把这个CTRLC我复制过来以后,能保证我们rabbit MQ里边发送数据呢,也都是杰森把下边的这个消息确认机制,我们可以暂时不用把这个关掉,大家想要引入呢,来确认一下就行。好,那现在re MQ呢,我们就配好了,那接下来来到我们的这个业务里边,来到我们的service,那么这一块消息准备好以后,我们就应该给rabbit MQ里边来发送消息,来注入一下rabbit tempt来使用rabbit temp rabbit tempt我来写一个owa,而且呢,我们不用来加这个enable这个注解,因为这个注解呢是来监听我们这个rabbit MQ消息的时候,我们可以加,但是如果我们不监听,只想用re MQ的这个termin来发消息,那么就可以来直接用就行了,好,我们拿过来,我们在这来做一个消息的发送,最后它呢,点一个convert and send,我要发给的交换机,这个交换机呢都是固定的,我把这一块的复制过来,CTRLC交换机是我们这一块的内容。
02:51
你把这一块都删掉。这边也一样好,我们要发给的交换机,包括呢,我们现在用的路由件,以及我们要发出去的消息都是什么,那路由件呢,我们在这儿也固定了,叫order second kill order就是这个路由件。
03:08
这个路由件呢,我们来发给这个交换机,最终就会发给一个指定的队列,那这个消息是什么啊,我们来准备一个数据,这个数据呢,由于我们发的订单服务要收,所以我们直接写到common里边,所有MQ的这个to数据我们都放在common里边,Common里边呢,我们就叫quick order to,这是我们一个快速订单的这个to,哎,我们也叫秒杀订单,我们就叫second q,我们这个秒杀订单的这个to数据,这个数据里边有什么at,一个data,我们就直接拿过来,那有什么呢?我们现在来到我们的这个秒杀服务里边,现在我们肯定创建了一个订单号,我们现在来用一个我们叫second p,我们的这个。To order to,那这个to我们准备好这个数据以后,它里边呢,首先是我们的订单号,我们希望呢有一个订单号,所以我们在这儿来准备第一个数据,Private string类型的order SN,这是我们的订单号,然后我们在这来设置一下订单号,订单号呢是我们自个生成的,这个订单号一生成以后呢,接下来包括我们这个订单里边买了哪个商品,因为我们这个是秒杀,总可以把秒杀的这个商品信息我也放到这儿,那直接把这个秒杀的这个商品信息,我们呢,就可以来复制过来,我们来看一下秒杀的这些商品信息里边,这个T5里边,我们把能用的呢全部拿来,我把这一块先CTRLC这个大对象呢,我们放到这儿先暂时不用来看,我们一会儿要用什么来到这儿,好,我们秒杀呢,秒杀的是哪个SKU我们都知道,是哪个场次下的我们也知道,包括这个活动呢,我们就不要了,然后呢,再来加上我们秒杀的这个商品。
04:53
的价格啊,那就是这个价格,然后呢,我们秒杀的这个总量,不应该是总量,应该是呢,我们现在秒杀了几件,我们的这个number,然后呢,这个限购数量那就不必要了,这是我们自己在那来做一个限制判断的排序,那也不必要,还有这个开始结束时间,这是我们这个to里边,To里边呢,其实传这几个关键数据就行了,其他都能传到第一个什我们的订单号,这是什我们的订单号,我们传到这个订单号,然后传到我们这个活动的这个场次ID。
05:26
场次ID,然后呢,再来传一个我们这个商品ID,传一个商品ID,我们就能根据这个场次ID和商品ID能查到当时这个活动我们这个商品的这个秒杀的价格信息,当然为了方便我们把这个秒杀价格呢,我们也传到这儿,然后最终呢,还有我们这个买了几个,我们购买数量,购买数量这个数量呢,得到以后单是哪个人购买的,我们直接来传一个浪类型的member ID,会员ID,我们呢就来传这几个数据,那其他的东西,我们订单服务呢,想要用自己在这儿拿到关键信息去来查就行了,主要就是一个订单号,我买了这个商品,买了几件,就是这样好来到我们的这个service里边,我们继续来发这个请求,Order to里边,我把这个order to呢,先来准备一下,我们直接来发出去,然后呢,接下来我们给to里边准备一些数据,To里边点一个我们这个订单号呢,有了我们继续来set会员的ID,会员ID我们从我们的这个。
06:26
Member user,那么这个登录的用户是这个response VO是我们member的这个用户,点get ID,这是我们会员的ID,还有order to点一个set,会员ID订单号都有了,我们购买的商品的数量,直接我们将数量呢传过来,包括这个order to点一个set,我们购买的呢是哪个商品,这个数量这个都有了,活动的ID,商品的ID和价格,活动的ID我们就直接拿到我们从red里边获取到的这个完整信息,拿到它的这个活动场次ID,点一个get,我们的这个session ID get promotion session ID,然后呢,剩下order to点一个set,我们购买了哪个商品,我从rabbit里边点一个get SQ ID也可以SQID,然后呢,包括我们最后一个点一个set。
07:20
我们秒杀用的价格,从red里边get我们的秒杀价格,所以呢,这是我们这个订单传出去的这个to数据,我们直接来发一个MQ消息就行了,只要能发出去,来到我们的订单服务,好订单服务,那订单服务呢就要监控这个消息,所以我们给订单服务里边我们来配上一个队列和一个绑定关系,MQ con里边我们配了超多的队列,超多的队列好,那都在这,那再来加上一个队列和绑定关系,那按照这个要求,我们现在呢,又有一个队列叫order。Second q,这个order q,那就是这个队列public,我们来写一个Q,我们要创建一个队列,我们就叫这个队列,我们订单的这个秒杀单的,我们这个监听队列,这个队列呢主要是来做消峰用的,我们来消流量的峰值,然后呢,我们后台呢就来慢慢的监听这个队列,你有一个Q这个信息,Q里边要用的所有内容我们拿过来,还是把整个信息呢全部复制过来,那这个队列是一个超级普通的队列,所以我们现在呢,想要调用,那就这几个内容,首先队列的名字,名字是什么,我们文档里边名字是什么,就直接来复制CTRLC,然后来到这儿,名字呢叫order second q,我们这个order q这个队列,然后呢,是否持续化的,那肯定是,然后呢是否排他的,大家呢,都能监听,用谁抢到算谁的,还有我们这个是否自动删除,那就不用自动删除了,然后呢,我们还要传这个参数属性信息,我。
08:56
我们这个又是一个普通队列,那就不传了,按一个B,那写好以后呢,再来写一个这个队列的绑定关系,好来加上一个帮顶,这个帮顶呢,我们就是这个Q的帮顶。
09:10
我们把这个帮顶拿过来,我们来return一个new,一个帮顶操作,这个帮顶呢,我们要用的这些数据,我们拿过来,这个数据呢,还是这么一串CTRLC来到我们的config里边。来重新给这一块来做这些操作,第一个目的地我们现在呢,相当于一个交换机跟我们这个队列来进行绑定,目的地呢,就是这个队列,目的地的名字是这个队列名,目的地的类型destination type,我们是一个队列,我们的目的地呢是一个队列,然后我们是哪个交换机,那这个目的地绑定的把交换机的名字,那就是这个订单交换机,订单事件的交换机,那一直都是它,然后呢,包括我们路由件用的是哪个,那这个路由件呢,直接精确路由。
10:01
Order second kill order我们发的时候呢,也是发的它好,我们在这复制过来,然后呢,再来加上我们现在呢,有没有这个绑定关系,有没有什么参数,那没什么参数,我们就在这儿来固定一下,然后来按特B,那只要订单服务一起来,我们就会有这个队列,那有这个队列呢,我们的订单服务就应该监听这个队列,这个队列我们来到listener里边,好订单的close的listener,订单支付的listener,包括我们现在呢,有一个订单秒杀单的这个监听器,Order,我们就叫second kill的这个listen呢,或者呢,我们把这个list呢,跟某一个人,我们直接全部写在一起,这个支付呢,这是一个controller,我们整成了一个listener。好,那在这呢,可以来写在一起,这是一个关单的这个队列们来,除了监听关单的队列,算了,我们不写一起了,那在这来创建一个新的吧。我们就叫order second kill,我们的listen,我们专门来监听我们这个秒杀单的at,一个component,我们这是容器中的一个组件,而且呢,我们想要监听得来写一个构件叫rabbit isner,那来监听哪个队列,来指定上们想要监听的这个队列呢?就是这个,只要这个队列里边有内容说明我们这个秒杀服务给我们创建了一个快速订单,那接下来后台服务就要慢慢创建,那接下来我们就来写一个处理方法啊,我们直接把这个close的处理方法来复制一个CTRLC,包括这个service为我们拿到这个方法,我们来进行处理,我们这个方法呢,现在监听的不是order entity了,我们现在是一个second order的这个to,我们秒杀单的这个to second kill order to们监听的是这么一个数据,好。
11:47
那么这个呢,相当于是我们的一个秒杀单,秒杀单信息,那这个秒杀单信息呢,我们在这儿就来打印一下,只要秒杀单进来了,Excel for街,那就在这日志打印一下log,点一个info,准备咱们这个创建秒杀单的详细信息,详细信息好,那这个秒杀单的这个信息呢,我们全部在这已经都有了,只要我们处理完就给它来返回A4K,所以我们现在呢,就应该叫create second kill order来创建一个秒杀单,把这个信息呢,直接拿过来,我们来直接创建,我点一个创建好这个方法呢,来加上一个它的实现,那这个方法跟我们普通的这个创建订单呢,稍微不一样,因为我们这个是一个秒杀单信息,所以呢,这个为了简单起见,其实大家在这一块呢,就可以做一个图do,就是我们保存订单信息就行,这个订单号呢,我们都指定好了,所以们现在呢,只需要做一个保存,那么可以调用。
12:48
用一个save order,那们先来保存我们这个订单信息,然后订单里边呢,又有一个订单项信息,所以我们可以把这个订单项也放到这个order里边,订单项呢,那就是这个order create to,所以我们在这呢,好,我们先来跟它一样,我们来做第一步叫save order,我们想要保存订单,但保存之前呢,先要创建订单,我们这个私有方法,这个订单创建订单号这块呢,其实都有了,那我们呢,也就不用这么复杂了,我们就直接来用一个order entity来创建一个订单实体类,那接下来就准备来保存它订单实体类里边我就设置几个关键参数来演示一下就行了。订单号订单号呢,那就是我们这个秒杀里边我们返回的这个订单号,我给你返回是什么就是什么,然后呢,Order enity,再来设置这是哪个会员创建的订单。
13:38
把这一块拿到点一个获取会员ID,这就没问题了,那其他的所有信息呢,我们都可以设置,另外再需要设置的一个就是比如我们的收货地址,这个收货地址我们其实应该有一个确认页,我们再来收货地址,我们这些收货地址呢,在确认页确认的时候,你可以给这儿来填充,所以我们这一块呢就不写了,然后呢,如果大家想写也可以来作为。
14:03
查出当前用户的默认收货地址都行,那在这儿来再来set一个,我们再来set一个什么呢?那就是statuss,我们当前订单刚过来的状态,Order letters枚举,那这个呢,订单是刚创建成功,那就是呢叫零待付款状态,点一个get code,然后我们以后呢,支付还要用它,所以我们这个状态呢,标志好,其他的信息我们都不要了,但是额外的要一个这个pay amount,那现在要支付的整个信息,我们要给他付多少款,那么应付的款项呢,应该是这个second kill order里边来获取了当前商品的这个数量,还有呢,这个秒杀的这个价格,我们让它价格呢,Multi派来乘一个数量,用一个贝个decimal,这个数量呢,我们得到一下这个数量,我们还是给它弄成string,点一个get一个,我们的数量,然后呢,最终乘到了我们的一个价格,我们把这个价格呢,给这一放。这是我们应。
15:03
付价格,来看一下我们订单的数据库,来到我们这个订单数据库,每一个订单信息,其他的这些我们都可以不用设置,主要呢有一个应付价格,应付价格就是我们后来要支付的,那在这一块呢,设置好了以后是按积分,这些我们也都不要了,这块收货信息好我们都留在这儿,行,那么现在呢,就准备了这么一个订单信息,但是订单呢,我们想要保存,我们就来调用order item service,点一个save,那保存订单,这是订单项,嗯,这个订单呢,还是我们这个this,当前就是订单服务,我们来调用save,把这个订单实体类已保存,然后这个订单呢,还有一些订单项信息,所以这个订单项我们再来保存,保存订单项信息我就来做一个快速创建就行了,所有的其他内容大家在这呢一一来判断进行完善,这个订单项呢,目前就一个订单项,Order item entity,因为现在这个秒杀就是一件商品,我们来买多少个所。
16:03
那这个nity里边呢,就来设置上这几个信息,第一个是一个set ID应该是我们的order SN订单号,比如说我们现在呢,就是这个订单号们确认就是这个订单号,点一个get一个订单号,这个订单号有了以后呢,Order entity,我们这个item en这个订单实体里边我们还要set set这一块呢,都是SQ的一些其他详细信息,我们就可以远程来查出SQ的信息,在这来set就行了。主要呢,我们再来set一个,这个东西叫real amount,我们真实要付的这个价格,所以这一块的这个价格,那其实就是我们这个订单总额,因为这个订单呢,现在就这么一个商品,我们就放在这儿,当然我们给这个订单呢,没有加运费,如果你选了后来加一个运费也行,来写一个order enity,再来点一个set,我们肯定还得保存我们这个商品呢,买了多少件,这有一个SQ quaity,好把这个买了多少件我们拿过来,这就是我们的数量,这几个呢,我们来一保存,然后呢,其他的所有信息。
17:08
我们都可以拿到我们的远程的这个份。比如我们商品的这个份service product份service,那想要获取SKU信息了,这还有Su for的这个信息,那么就可以像以前一样在这获取,获取来,在这呢,慢慢设置,其他的这些信息,我们也懒得设置了,这一块呢,留给大家todo来获取当前sko的详细信息,信息设置好。我们就来设置一个最基本的内容,然后我们使用order item这个service,点一个save。来保存一下我们的这个订单项,那这一块呢,我们整个流程就打通了,只要我们一秒杀成功,我们队列里边一收到消息,我们订单服务呢,就会为我们来创建一个订单,好,那现在我们来重新完整的来测试一下,那将订单和我们的库存,那现在呢,是我们这个订单服务,还有我们的秒杀服务来启动一下,那么现在呢,来测试秒杀,我们这个时间呢,肯定过了,我们这个商品呢,没有这个秒杀时间,我们现在呢,都已经这个05:40,我们现在可以来改变一下这个时间,我就来调整一下日期时间,我直接把我当前的机器的这个时间,因为我们这个活动呢,是16点以内,就调一个14:40。
18:26
让我们能参与这个活动,那些同学说,那如果是不是京东的活动,我调一下我的时间也能提前参与呢?肯定不是,我的这个代码呢,运行在我的机器上,所以我调了时间,代码的判断的时间拿我的机器,但我们给京东来发请求,那这个时间呢,是跟着京东的服务器走的,我们在这儿调只是为了开发测试方便一点,来重新刷新一下。好,现在来到这儿,我们发现呢,现在又参与到我们这个秒杀了,然后我们如果我们想要秒杀,我点个立即抢购,这个是没有的,我们得先登录,我们来登录进来,登录进来以后呢,我们再来去抢购,我们的秒杀请求就发出去了,好,这是我们要秒杀的商品,点进来,我点一个立即抢购,来到我们秒杀服务,给我们返回success,诶我们订单号2705创建了,那来到我们这个订单服务,来看这个订单服务,诶我们这儿呢,也收到准备创建我们这个秒杀单信息,那么再来数据库里边确认一下,那这个秒杀单的这个信息有没有创建出来,那现在主要呢,是有一个这个订单号来查一下,在下边select新from我们这个订单表里边,然后呢,Where,我们的这个订单号order SN,我们的订单号等于我们指定的这个值,好,我现在呢,就把这个来查询一下。
19:43
走诶我们发现呢,这个服务确实为我们来创建了一个订单,然后呢,我们要支付的价格是这么多,因为我们只买了一件没问题,所以我们这一块呢,要能返回成功,那就是订单我们创建成功了,咱们现在再来看密,因为我们这个判断只我们秒杀过了呢,那就不行,所以我来F5刷一下,我们返回是那那呢那就是没成功,包括如果我们来输错一个内容,那么这块K呢,我是乱猜的,我随便提前乱猜来走一下还能返回那。
20:13
包括我们来超了数量限制,我来要秒杀上十个,好,我们把以前的这个正确的还留到这儿来秒杀十个回车,那还是呢,所以呢,只要有任何问题,我们这个秒杀单呢,都创建不成功,而这个秒杀单只能创建一次,鼓励秒尔康,好,那么这个秒杀单呢,在这儿每一个用户呢,只有一次,因为在用户级别,我们来做了防虫,来reload看一下六杠七杠幺,就是它我们来做了一个防虫,六号用户,然后七号这个场次,一号这个商品,我们这个呢已经秒过了,就秒了一件,那你想要再来秒,我再来点一个立即抢购,那就一直是闹,那么这个秒杀呢,就写好了,那如果是别人来进来秒杀,那现在呢,带的这个码是FAE0,我们来看一下,在我们这个库存里边second q,我们来找一下这个E0,就是它由于我们这个秒杀一成功以后,信号量呢减一,因为我们当时这个商品呢,应该是上架了两个在这儿后台可以来确认一下。
21:13
我们在这儿点一个关联商品,我们来看,确实呢秒杀总量上架了两个,所以我们只要秒杀成功一个,那在这儿呢数量就会减一,那为了我们这个防虫这个验证失效,我把这个删掉好,我再呢秒杀一次,秒杀一次呢,我们这个数量呢又减一,我们来确认一下,我来刷新好,现在呢又秒杀了,秒杀以后呢,数量又在这儿来减易看一下,那如果我再来秒杀一次,然模模拟多个用户,我每次把这个呢删一下,模拟多个用户,我想要再来秒杀一次,我们看能不能秒杀成功来刷新。我们呢,想要获取信号量,那就应该是获取失败的,但是我们来看一下这块的效果,我们这个信号量FAE0。我们已经减到零了,来看一下我们这个秒杀服务的创建。
22:00
来到我们的second kill,好,我们把这个其他的呢,我们都来关掉second kill我们来看一下,那这一块呢,肯定是有问题,那在这service里边秒杀的时候呢,只要我们的信号量,我们呢是在这尝试获取一个信号量,这个B呢,我们拿到我们得判断呀,所以呢,If b只要信号量成功了,我们才应该去来做秒杀下边的这个事情,否则我们才是返回nu。所以我们写的是一个他,否则呢,我们可以在这来return一个呢,这是我们这种情况,包括我们让他等待,也不等待这么长时间了,我就让他尝试踹一下就一下就走,你能拿到这个信号量就走,拿不到了那就算了,这是我们的TRY块,那如果是这个串的情况下。穿块不用等待时间,那我们就没有任何异常需要补货,那么就把这一块呢,可以来去掉ctrl all代码整理一下,这最终是我们这个秒杀服务,也就说所有审核都通过以后,我们还有最后一个信号量,那这个信号量呢,我来重新再来启动一下,来重新启动我们的秒杀服务们给这个信号量里边呢,来加上一些商品,那刚才这个测试呢,有点失败,好我们来保存一个二保存,现在呢,我们要秒杀的这个商品,FAE这个商品呢,有两件,那看我们都能不能秒成功。
23:21
如果秒了两件以后呢,那就应该不能秒成功,因为我们在这儿呢,是拿信号量来判断的,只要拿不到信号量,我们就不创建订单,创建订单我们直接发给消息队列。那整个方法呢,执行能有多快,我们自己呢,也可以在这来判断一下,我们有一个衡量标准,比如system。点一个current time,我们这个当前这个时间,我们就叫一,然后呢,我们整个执行完成以后,我们最终的这个时间订单创建完,最终都要返回了,那这呢有一个时间S2。我来算一下我们服务的耗时log info,好,那在这来加上cell for键按一个cell附件,我们在这来记录一下我们整个服务的耗时时间,我们看一下我们这个到底性能有多高,点一个ino,我们这个耗时。
24:15
耗时是多少呢?我们就来打印一下我们这个S2减去我们这个S1的这个数值,当然这个呢是一个毫秒,我们来启动一下,好,我们这个秒杀服务呢,启动成功,来重新测试一下秒杀。我们来先第一次秒我们这个呢是失败的,因为我们这个用户已经秒过了,来reload把这个呢删除一下,我们来重新秒我们这个商品呢,就两件好秒一件。这个秒成功,我们把这个呢再来删除一下,我们只要秒一下,秒成功以后,我们这一关库存量我们来看一下FAE0变成一个一,我再来秒一下刷新又秒成功,我们来看一下,我在这呢重新来清空一下,走把这一块呢一清空。
25:00
我们这个用户呢,就相当于又没秒过,我再来秒一下刷新,诶我们发现呢,拿不到信号量,那这一块呢,就一直返回为空,所以这是我们自己秒杀接口的编写,我们这个接口呢,本身性能还是非常高的,来到我们服务里边看一下它统计的这个时间,我们这个耗时呢,我们发现只用了12毫秒,那这个12毫秒那就非踌快了,我们如果都是这么个秒杀速率,我们一秒呢,相当于一个线程能处理100个请求,我们汤姆cat呢,假设同时有500个处理请求的县程,那我们现在呢,就一个秒杀服务,单机部署情况下,我们就能处理5万的并发,所以呢,接下来他如果有100万,那么这个秒杀服务呢,来建立20个单机集群那。绝对可以做到,那就算是做到以后,我们也不害怕把订单服务压垮,因为所有的这个你只要秒杀成功了,你虽然说来有100万,但是可能呢,真正有库存的,我们约定以后,所有全部约定完了以后,特别是这个有库存,最终呢,放给我们订单的呢,可能只有一两万,甚至一两千,甚至几百,而且呢,这几百我们都是拿消息队列直接来消峰处理的,那直接发给订单服务,订单服务呢,在他后台直接帮我们来创建出订单,然后我们这一块呢,只要返回订单号,那就说明成功了,所以如果我们在这儿要做页面的话,那就是。
26:21
你在这呢,只要1.1个秒杀成功了,我们就在这页面提示,诶恭喜你秒杀成功,我们服务器正在准备订单,然后在下边呢,给一个按钮,比如呢,确认订单去支付这个就行了。那么下节课就来简单的来做一个可视化的这个页面逻辑。
我来说两句