00:00
接着前面的逻辑,那么这一块呢,有一个锁库存方法,那么只要库存锁定成功以后么,这个订单服务它掉了远程的锁库存,我们可以来看一下订单的service,订单service调用远程锁库存,只要成功以后呢,我们就会返回零,那失败我就会有失败的其他状态嘛,那只要锁定成功了,那么所有的订单也保存了,库存也锁了,我们整个订单呢,相当于就提交完成了,我们就可以把订单的这个response数据我们就返回出去了,那锁定成功我们就可以给他返回response数据,那要是锁定失败了,同样的们也得返回这个response,明确的告诉他我们这个锁定失败了,Response点一个,比如set code code,如果是三,那就代表们这个库存。出现问题,当然我们也不用感知哪个库存出现问题,想感知,我们可以把远程的这个接口让他返回的时候丰富一下行,那么现在呢,就是库存锁成功了,我们给他返回,但返回的这个response里边,我们还应该set一下order,我们刚才创建好的完整订单,因为整个订单呢,在这儿创建完,而且呢在这也保存完了,把保存后的这个所有订单信息点一个get一个order给它拿过去,我们放到响应里边,那么这个方法呢,下边的这个return就不用了,所以我们只要任何环节,我们最终全部订单创建了,价也验成功了,我们保存了订单,而且我们在这儿远程锁库存,这是一个非常重要的操作,这个叫远程锁库存,远程锁库存我们也成功了,成功了以后呢,我们就给它返回我们的整个响应数据,我们来到submit order,好调用这个方法,那么这一块呢,数据就有了。
01:49
啊,如果是GET0,如果我们code没有放其他的这个状态嘛,那就是一切正常的,所以呢,我们上来先给我们要返回的这个数据,Code的呢,我们先来set一个code的都是一个零,只要有任何异常code的都会变成其他的代码,所以我们在这判断,只要我们这个code的是零,我们就下单成功,来到支付选择页,那支付选择页呢,我们要把这个响应的数据放到页面,最起码告诉页面是这个订单下单成功了,所以呢,我们现在要做的事情就可以写一个model,好,我们来写上model model我们给页面来放一个数据,点一个and attribute,那么现在呢,就叫response为那K呢,我们就叫submit order response订单提交的这个响应,好,然后呢数据,数据呢,就是我们整个这一块的数据,那来到我们的支付确认页,我们看一下,修改一下我们页面里边。
02:49
的内容,我们来只修改核心的两块内容,首先我们这个确认支付页,我们来看一下我们的这个确认支付页的数据,我之前看过,我们来改一看下这块内容,订单号是多少,然后我们这个订单金额是多少,然后还有我们这块订单的详细信息,那我们先就改上这两个位置就行了,好把这个CTRLC我们直接一复制CTRLF,我们来到我们的这个页面,订单号是多少,应该自己取出来,双中括号,Dollar for大括号,因为我们给页面放了一个叫submit order,那么订单提交成功的这个response VI。
03:28
好把它呢就取出来,它里边呢,会有我们要用的数据,这个controller里边,我们放在这个response为O里边,它里边的order点一个order,就是我们要用的这个数据,点一个order,这个order呢是一个对象,这个order里边它的订单号就是我们要在这来显示的,好我们来显示一下它的订单号,包括呢,我们这应付金额应该是多少元,我们也可以双中括号,好Dollar乐福大括号来显示一下,还是这个里边的数据。
04:01
我们应付的金额还在订单里边,订单里边呢,有一个订单的应付金额们来看一下,我们在保存订单的时候呢,在订单的后边,我们这都是时间来看一下我们的订单的这个应付金额,金额在上边,这是优惠券抵扣的,这有一个应付金额,那就是它,所以我们就要展示它,当然我们这个呢,我们还是要number format格式化一下,我们使用SIM的这个numbers这个工具,点一个我们这个format,我们只有直接来找一下我们以前item的这个页面,点HTM。来找一下item的这个页面,我们来把这里边的format来找一下,有一个叫numbers formatma,好把这一块呢复制过来,我们现在呢,就要来格式化我们的这数据。我们把这个numbers去掉,好,我们现在井号numbers format。我们现在要格式化的就是订单的这个应该支付的这个金额数据这个金额呢在这儿。
05:07
然后呢,我们给它显示一位,保留两位小数,我们在这个页呢,就显示这些就行了,我们现在来整体来做一个确认,我们修改了好多服务来重启一下订单服务,商品服务,库存服务,主要是我们这几个服务,以及我们的购物车服务。我们都来启动一下,来整个运行一下我们的订单流程,看我们能不能下单成功,那只要下单成功,我们订单里边呢,就会有数据,我们来等待我们后台服务器启动完成。好,我们稍等一阵以后呢,我们现在所有的服务我们都启动成功,订单服务,商品服务,包括我们的库存服务,以及我们关键的购物车服务,那先来启动成功以后,我们来测试一下整个下单流程,那么先来刷新,我们先得保证我们的商品登录,现在整个网站要登录状态,来重新登录一下,好,我们来使用微博登录。现在我们这个登录进来,我们就来进行一些交易,好,我们现在来买一些商品,那么现在来买一些我们有库存的商品,或者我们这个购物车里边,我们来看一下我们这个购物车里边,那购物车里边默认的这几个商品呢,应该是没有库存,来点一个去结算,由于我们这个第一次远程调用肯定呢会超时,所以他这儿呢有异常,我们就刷新一下就行,好那现在呢,这一块我们的结算页数据呢都有,有一个呢确实是没库存,而有一个呢是有库存,那接下来我们来提交订单,我们看能不能提交成功,我们一提交订单,我们就会发给我们的萨order请求来到订单服务里边。
06:38
我们来看一下我们的submit order,那订单的controller在这,我们提交订单的请求,好,我们现在来准备提交订单,提交订单然后呢,发现这个服务器500内部异常,来看一下我们这个订单服务哪一块内部异常,我们这儿呢,有一个控指针异常来到这儿,这一块呢是在验价环节,我们想要获取订单里边的这个应支付金额,那这一块呢是空的,空的的原因肯定是在我们这个创建订单的时候,而这些金额没设置进去,那把就把这个请求重新刷新一遍,可能我们设置数据的时候,这个由于远程调用的问题,我们现在还不稳定,所以导致都是空的,好,我们来重新提交一遍,由于我们是重复提交,把我们打回来,所以我们直接来到这个页面,来到这个页面以后呢,接下来再来提交一个订单,我们来点一个提交,好,现在来到我们这个订单确认页,来看一下我们这一块报的异常,这块报的异常呢,来到这儿还是我们这个金额的问题。
07:35
那么这个金额有什么问题,我们来看一下,在我们这个order,我们调用创建订单的方法的时候,我们在这呢创建了一个订单实体类,并且呢创单建了所有的订单项,但我们忘了把这个订单实体类没有保存到我们这个create to里边,因为这个to里边呢,我们要保存一些数据,们创建好的这个订单实体类我们要保存,包括我们create to里边点一个set,我们所有的订单项数据我们也要保存,我们在这儿,这是我们所有的订单项数据们少了这两步,走好我们来重新启动一下我们的订单服务,走好我们这个订单服务呢先成功们先来重新刷新一下这个submit order,这又是一个重复提交,我来刷新,他都说了我们要重复提交这个表单,我点一个继续,于是重复提交,会把我们打回来,来到我们的to try订单结算页,我们重新确认好,来到这儿以后呢,我们确认好没问题,我们只要一刷新这个页面,令牌就会换,换了以后呢,我们再提交才可以我来。
08:36
点一个提交订单,好,订单提交以后,接下来这块呢,报了一个错,说error update,那在这来更新我们数据库的时候,说我们这有一个insert to OMS order,我们给订单这个表里边插数据的时候,有一个东西叫date to long,我们这个数据太长了,For order SN,那就是订单号,我们生成的这个订单号数据太长了,来到我们的这个订单表里边,来看一下我们的这个订订单表,订单表在这儿来改变表,来看一下我们的这个订单号,订单号呢,它是一个差32位,它这个东西呢,太长了,那我们来给他指定一个64位,好来指定一个64,那这一块订单号是64了,那其他地方所有是订单号的地方我都应该是64,我们来到这个订单的item这一块,我们来改变表,我们就把它的这个长度,这个长度呢,有一个订单号,好,我们来全部改成一个64。
09:34
那生成的这个订单号有点长,好,我来点一个确定,那现在来重新测试一下,来重新提交,我来点一个提交,走这是一个重复提交,我们要重新确认,来点一个提交订单。提交订单以后呢,给退回来了,那退回来的这个原因肯定就是我们所库存等各种出现了问题,只不过这些问题呢,我们在这儿没给提示,来看一下,确认一下数据库里边的信息,我们先来打开订单表来刷新们以发现呢以前有一个订单,我把这个订单呢,我先来删掉走。
10:07
然后还有这个订单项,然后我们发现呢,买这个商品二号和一号,我们确实呢都生成订单项了,我把这个也删掉,然后呢,我们来重新提交订单,为什么呢,会退回来来看,应该是这个效果。我先来刷新一下,我只要点击提交订单,那订单能创建,那来到我们的controlrler,我们来看一下我们写的整个流程,只要我们这个订单能创建,那就一切OK,我们金额对比,只要对比成功,我们保存订单,刚才订单都保存了,说明我们金额对比是成功的,然后接下来我们就是远程锁定库存,那锁库存以后呢,接下来就有锁成功和锁失败,那么现在就根据每一种状态,我们来给页面一个提示,让我们明确知道是什么出了问题,好,来到web ctrler,只要我们这个状态不是零,那就重定向到这个页面,但重定向这个页面呢,我们来给它加一些数据,我们让它重定向的时候呢,携带一些数据,我们使用redirect attributes重定向携带数据的这个方式,好,我们让它携带一个这个redirect attributes.and一个flash attribute1闪而过的属性,好,那么现在就添加一个message消息,这个消息添加什么?那么现在呢,就来做一个判断。
11:20
Response we,点一个get code来写一个Switch。我们来判断我们的这个状态码,这个状态码呢,我们有各种情况,CASE11的话呢,我们现在就给一个赋值,比如string message,那现在这个message就是我们这个下单失败,好,这是默认的这个下单失败信息,下单失败信息如果是一,状态码是一,我们来到我们的业务看一下,状态码是一,是令牌校验失败,我们就给他提示,那这个message我们就给它重新附一个值,比如我们就等于我们可以加,等于我来拼一个串们下单失败的原因就是令牌。
12:05
校验失败当然对于前端的这些用户,可能他们不知道什么叫令牌校验失败,返回一个订单信息过期,请重新提交,我们来返回一个人性化的订单,订单信息过期请刷新,再提交请。刷新,再次提交,当然我们能来这个页面其实就已经刷新了,好,这是我们的第一个CASE1,我们是这个状态,我们break啊,然后呢,接下来K2。如果我们是第二个状态K2,如果我们状态码是2MESSAGE加就应该等于我们状态码是二的情况是我们在这儿下边呢,这一块我们来看什么时候放二,在这放二,也就说在我们这个验价失败,所以呢,我们就应该给它提示,我们这个订单商品价格发生变化,发生变化,请确认后,确认后再次提交,好,这是我们的这个信息,我来给一个。
13:15
然后呢,我们CASE3如果是三号状态,我们的这个message加就等于我们来告诉他,如果是三号,那就是锁库存失败了,所以我们写一个break,最后一个break,写不写都行,好,我们来写一个,那现在就是我们这个库存锁定失败,那么这个商品库存不足,商品库存不足。能把这些提示信息呢,就放给这儿,只要能回到我们的这个交易确认页,我们让交易确认页走,给我们显示上一个消息,这个消息显示在哪呢?我们就显示在填写并核对订单信息下边,好,CTRLCCTRLF,我们就随便给页面里边填一些效果就行了,好,我们就放在这这一块呢,来写一个SPASPA,我们呢是一个style color red,红颜色的。
14:13
好,如果我们现在有失败th if,那么就应该是Dollar大括号session里边只要呢有这个message消息,Session message,只要我们session里边的这个message不是空的,好,我们写一个不等于none,那说明我们这个session里边有消息,那有消息我们就显示这个span,这个span的内容就是th task,就把我们这个消息一显示就行了。Dollar符大括号session里边,也就是说redirect attribute,我们按flash的这个方法,它是模拟session里边放的这个数据,所以我们直接可以从session里边取到我们这个数据,当然最快的方式我们连session都不用取,我们就让它取message message不为空,我们就来给它取出message,因为它默认呢,给session里边放的数据给我们请求域中也放了,我们也可以来取出来,好,我来CTRLF9,来看一下我们的页面效果,那现在来重新提交我们的订单信息,我来刷新,好,现在这呢是一个订单,我们准备来提交订单。
15:13
提交订单,好订单呢提交失败了,那失败这一块呢,就应该来显示失败信息,那这个失败信息没显示的原因,我们写的这一块代码我们得重启一下,好来让订单服务来重新启动一下,我们刚给他添了一段代码,好我们现在呢再来进行一个测试,那刷新一下我们这个订单,那么这个订单里边的数据呢,我们现在准备来提交,我点一个提交订单。我们来看一下订单能否提交成功,诶我们这一块显示下单失败,库存审锁定失败,所以呢,这是由于我们远程锁库存出现了问题,导致我们这个订单失败,回到了这个页面,那既然回到这个页面,我们创建的所有订单来刷新一下,发现以前失败了的东西全部都创建出了订单,把这个删掉。我们把这一块呢,也打开我们订单项里边,我们订单呢,是创建好了,这是我们这两个订单,我们来重新来删一下,我们这个订单项的数据们之前好都已经删了,那先来测试,那再要下订单走,只要提交订单,他就说库存失败,虽然库存失败,但是在订单里边有订单信息,我们这儿还有订单号,在订单项里边,我们这个订单购买了两个商品,我们这儿也有信息,但是由于我们远程扣库存是失败的,来看扣库存。
16:30
我们所有的数据呢,都是原来的默认状态,比如我们来写都写上0000,因为整个库库存呢,它是一个事物,只要一个一失败全部回滚,但现在出现的问题就是如果我们扣库存失败了,那这个单也不应该给我们下出来,所以我们要控制住这一块的事物,那控制住这一块的事物,我们现在最简单的方式就在这,好,我们来到submit order submit order呢,我们在这儿会有远程锁库存,这是锁成功,这是锁失败,那我为了让他订单远程库存锁失败了,让他订单也回滚,所以们直接给订单加了一个事物,那让他回滚,那我们就抛异常就行了,所我们直接可以来入一个。
17:16
没库存的异常,我们把这个异常可以直接给common服务里边放一份,反正我们在这儿呢也都用了,所以我们现在呢,把这个异常。我们来复制过来,行,我们将整个异常呢,全部给common里边来放一个,那么相当于我们就能感知到各种异常信息了,我们点一个OK,那么现在呢,就有一个没有库存的异常,那来到我们的这个库存服务,我们就把库存服务的。这一块异常我们就可以暂时不用了,好我们把这一块的异常来删掉,那现在全用common里边的走,我们只要把这一块删掉,那全部引用的所有的这个东西我们都会报错来在这看一下,好这个异常呢,就重新让它导一下就行了,把这个异常导过来,包括我们的业务逻辑点进来,我们业务逻辑里边想要用到的这一块异常,好我让他呢也重新导一下走。
18:14
那现在呢,你这个订单的业务逻辑,订单的controller,诶库存的controller我们都改了,只要出现问题,你就抛一个noto exception说没有这个库存,我们抛了一个这个异常,我们现在来页面来做一个测试,只要我们来刷新提交订单请求,这就是一个重复提交,它验定盘呢就会失败。首先呢,他会来到我们这个订单确认页,稍等一下,第一次来订单确认页远程调用呢,经常出问题,好我们来再来刷新一下,好我们现在来确认一下,那这里边呢,这个商品是无货的,那我们现在呢,没有任何一个订单来刷新,确实没有任何一个订单,然后我们的库存状态,我们再来看一下,右键来在新标签里边,我们来打开表格,还有我们这个订单,订单呢我们在这儿,订单里边呢没数据,库存里边呢,我们可以都给它改为零。
19:04
这样我们就好看了,来看哪张表会发生变化,现在呢,就来提交一下我们的订单,来点一个提交订单。然后呢,它就提示我们商品库存不足,那这个商品库存不足,我们这一块就会来,我来刷新一下。我们这儿呢,没有创建出任何订单,那么扣库存,我们再来看一下,我们来刷新,我们也没有扣除任何库存,这是我们保证库存扣除失败以后,我们整个订单呢,也是一个回滚状态,我们保证了一个小事物,当然我们这个下订单跟库存的这个事物问题,它其实是一个非常严重的问题,那么下节课呢,再来仔细研究。咱们分布式系统里边能一些事物会出现的问题。
我来说两句