00:00
前面我们编写好了商品的整个上架功能,那接下来呢,我们就来启动search服务来做一个整体测试,我们以后启动呢,我们来都给它加上这个search服务,来点一个添加search,好,那search服务我们在这儿启动之前,我们先为search服务来编排一个端口,来到这儿改它的配置文件,假设呢,我们search服务我们就来用来看一下这块的端口,来用一万二的端口,那就server port,我们使用12000。那现在来启动search服务,当启动的时候呢,我们跟product跟外跟库存服务呢,我们都以debug模式启动,方便我们调试,我们呢就给这个up方法,我们来打上断点。同样的,我们给检索的这个search服务里边,我们也打上断点来到它的controller,我们的商品的整个保存这我们也打上断点,以及给我们product服务商品的上架,我们这已经打了断点了,那接下来就是我们的库存服务来检查库存,我们也打上断点来到库存的这一块CTRL了。
01:04
VR SKU ctrller,我们在这呢,检查是否有库存,我们来都打上断点来一步一步的进行来调用,我们来到后台的管理界面,好,我们来刷新一下,我现在来点击上架,重新登录me me,我们使用2R GNF。我们来到商品系统,我们的商品维护P管理。我们来点击上架,好,现在我们我们来到我们的debug PU ID是11,我要上架这个商品,我们来走下一步,首先查出所有要上架的SQ有八个,分别是一到八号到我们这些SQ,好没问题,接下来呢,我们来拿到所有的SQ的ID集合,这也是我们这个八个SKU,好没问题,然后呢,我们来找到当前SKU对应的这个SKU的所有的基本属性,检索属性,好我们来找,现在呢找到这个属性有七个。
02:01
但是呢,这些属性里边有些呢,不是用来进行检索的,所以我们在这儿还要挑出他们所属于检索属性的信息,那先将这些属性的ID集合起来走,那现在呢,拿到这七个属性的ID 781的,一直到16,然后呢,我们通过这些去来匹配哪些是检索属性,找到检索属性的ID,走,我找到了检索属性的ID只有两个,是15 16 15、16号,这两个属性可以被用来检索,然后呢,我们把这两个放到了我们这个set里边,好,我们来继续,那这个set里边呢,现在有两个15 16,然后呢,我们再来挑出我们15 16号这两个属性的真正值,从best at tr里边进行过滤,好,我们给这一块来打上断点。走,我们现在呢,过滤现在有两个,那只要过滤成了,我们就应该收集到每一个属性的item信息,好,我们来走,现在呢,我们来过滤成了at ts,这是第一个,我们构造了一个对象,这个对象呢要将它的属性值复制过来,现在呢,属性ID是15号的,它的属性名是CPU,品牌叫海思,这个是能被检索的,所以呢,我们在这儿复制了一个,好,第二个也一样。
03:19
我们复制一个,我们将它完整的收集过来,收集过来以后呢,我们来看我们所有的检索属性,检索属性有两个,只有CPU的品牌和CPU的型号是可以用来检索的,接下来我们继续来发送远程调用来查询库存好来运行。这一块的方法呢,这就是调用远程的方法了,那我们就给下边打一个断点,那如果来放行这个方法走。那这一块呢,就给我们跳到了VSQ的CTR了,这就是我们的检查库存方法,好,我们来运行走。我们发现呢,这有一个异常,那说明我们检查库存的时候呢,出现了问题,我们在他的控制台,我们来看一下这个控制台的这一块打印两个circle都没什么问题,我们来看一下它这一块出现的异常是什么,我们直接把它运行完,让它把异常抛出去。
04:11
好,我们来放行。我们看到控制台这一块检查库存有异常,说我们的这个方法,我们map映射的这个方法,只要是iab报的错,那肯定就跟myab有关了。我们的get sqtoto呢,他说尝试返回了一个浪,也就是说我们这个方法返回了一个浪,但我们要封装成一个浪类型的数据,没有封装上,那说明我们这一块就有一个问题来检查库存的时候。我们在这库存检查呢,返回一个浪类型数据,但有可能返回浪,这个确实是很有可能的,我们检查库存用这个SQ语句,但实际上如果检查一个不存在的库存,我们以前一号是有库存,比如我们的12号商品,我们没有录库存,它确实没有库存来运行,那他返回的呢,就是nu,那我们要能接收nu类型的数据,那么这块就必须写来写包装类型,我们把这个方法的签名呢,我来也改一下,我们写成包装类型,包括来到这一块,我们映射的呢,也是包装类型。
05:14
那这样呢才会没问题,那相当于来到我们的商品服务的方法,我们库存服务呢,刚才就有问题了,而且大家注意他这说的错误是我们的read timeout,也就是读取超时,说明我们调远程接口给超时了,我们在debug模式下很容易超时,因为我们再来调试远程接口的时候,稍微走两下那就超时间了,所以他在这儿报的是超时异常,并不是我们远程接口真正的数据库返回到那个浪类型异常。那么就把这个方法呢,我们来停掉,我们来重新来走一下,包括我们把库存服务我们也来停掉,那现在呢,将商品和库存服务我们来重新启动,库存服务呢,我们刚才给他签名已经改成了浪类型了,好,我们现在呢再来启动,以debug模式来重新上架。
06:06
好,那这一块呢,就启动成功了,我们继续呢,在这来进行测试,来点击上架,先来到我们的这个product的方法,好,我们来等一下。三断点进入到我们的这个方法。要上架的商品还是11号,那这一块没问题,那远程查库存这个断点我们就不要了,接下来我们直接放行到远程查库存走。我们在这呢,来进行了远程查库存,同样的我们来进行放行。现在呢,我们来跳到远程的查库存方法,好,我们来运行,我发现呢,这还是我们的错误,说明我们远程查库存的这一块,我们一直没有写好,好我们来直接给他放行来放行,我们来看一下是什么错误来到我们的远程库存方法里边。这一块呢,就是空指针异常,主要是我们在这儿来对比是否有库存,那如果count是空的,那肯定的就没有库存,那我们在这来判断一下count等等那吗?如果等等的,那就返回的是false,没有库存,否则那就返回count大于零的值,我们再来重新启动我们的商品和库存服务,好来启动。
07:23
好,我们现在呢,启动成功,我们来测试一下,来重新来点击上架。好,我们来看这一块。现在没有反应,那是因为我们服务刚启动,还没有在注册中心中注册,好好我们稍等呢,再来点上架,点击上架,好我们来看,现在呢,我们还是上架11号的商品来运行,走,那先查出的所有的SKU信息,我们直接放行吧,放行到这一块来远程查库存。来,直接放行,远程查库存。好,我们来进入到远程的查库存方法,我们step into,我们进去看一下,我们直接进入到了A界面里边,好,我们来把它点开,我们现在呢,给这来打一个断点来直接放行走。
08:09
我们来查询每一个SQ的库存,好,我们来放到这儿,好,我们来放行走,来看第一个SQ的库存,现在是一号SQ库存100,那我们在这呢,设置运行,那这一块呢,设置的汉字to,整个VO的内容,这就是处,好没问题,那我们继续来放行走。第二个呢,汉字to,我们来给它放行以后,它这一块呢是false,好,我们给return VO这来打上断点,我们来不断的放行,第三个也是false,没有库存,第四个也是false,包括呢第五个也是false,第六个也是false,包括我们的第七个第八个这一块呢都是false。那只有第一个有库存,那我们这一块呢,就查完了,查完了以后呢,我们来整体给他返回走。我还是拦到它的一些拦截器里边,好,我们不用了,我们直接给它return OK,打断断点,我来放行到这来看到这个OK里边的内容。
09:07
OK里边呢,返回message code的,包括我们的OK里边还有data的vos,我们现在八个数据,每一个呢,是否都有库存,我们都标记好了,那远程查库存我们运行完了以后,那就来到我们的PU的这一块,我们先把远程查库存呢,我们来进行放行,来到PU info service,我们切到product这个服务,我们的debug现在来到了它log error,我们远程查库存,说出现异常,异常原因还是超时,因为我们是debug模式,所以这一块呢老是超时,那好我们把这一块调通了,我们就把所有的断点我们都去掉,下次我们调用呢,就不会出现远程超时了,好,接下来我们再来在这儿进行。假设我们这个远程服务调用成功了,那接下来我们继续往下,他会拿到我们之前的所有库存信息,然后把这些库存信息呢,封装成一个一个的SQ ES model,给里边设置好所有的基本内容,包括它的库存信息是多少,好,我们来给里边的封装也打一个断点,而且呢,我们也要检索品牌的名字,分类的名字等等。
10:13
我们给需要返回的ES model我也打个断点,好,我们来放行,放行呢,我们现在来组装第一个数据是一号的sqo,我们先构造了一个对象,将属性呢对拷过来,设置它的价格以及图片,我们先来看ES model里边的数据先,基本数据SQIDSQID标题、价格以及图片我们都有了,剩下的呢,品牌ID和分类ID是有,但是这些名字图片也没有。来设置它来获取库存信息,那库存呢,现在是弄的,那我们默认那就是有库存,包括呢,我们设置上了热度评分,我们还要查出品牌的详细信息,走,把品牌的名字,品牌的logo也设置上,包括分类的名字,以及我们之前获取到的所有检索属性,检索属性呢只有两个,我们挑出来的两个,好我们来给它放行,那么这个ES model就封装好了,那一号SQ要上架的整个详细信息在这呢都有,特别是它的检索属性,那接下来我们继续来上架其他的商品信息,好我们直接来放行就行了,继续放行。
11:21
把这一块断点呢,我就去掉,我们来放行,到后边封装好的结果,这现在二号的SQ封装好了再放行,三号四号五号,六号七号八号好,那么这一块呢,都封装好了以后,接下来来到这一块,将我们的数据发送给我们的远程ES进行保存,把这一块封装的断点呢,我就去掉。那如果保存成功或者不成功,我们这呢都有相应的工作,我们现在就来测试调用远程的search phone service,我们可以先step into点进来看一下。那into之前呢,我们还是放行到我们的R这一块,走,放行来到我们这一行,那step into来到这一行,这一行呢,来到了我们的粪的调用,它先判断我们将调的方法是不是ES哈西code to string等这些基本方法,好,这一判断呢,我们让它走过,如果不是,它就进入dispach来进行真正的调用。这一块呢,就是来远程调用的功能,我们可以先step into进入,来看一下phone的源码,这一块来到了我们的central,我们同步的方法处理器里边,首先它构造了用我们传过来的这个参数,我们的ESSQ的这个model,我们是一个历色类型,我们要上架的这些数据,它呢构造了一个request templatet请求模板,好,我们来直接给它放行,这个模板里边有什么内容呢?有,它将要给哪发请求?给这search save product,还有发什么样的请求,编码格式是什么?
12:51
以及我们数据体的内容,这块内容呢,它已经用UTF8给我们编码成我们这些data数据,我们可以在这view and the string,我们来看一下,那么整个字符串呢,大家能看到这一块就是用杰森给我们编码出了一个数据说明份在底层会将我们的对象转为杰森,因为我们在这对象传的时候,包括我们在这配置远程接口的时候,我们本身呢,在这就说它是request body,所以呢份会给我们。
13:22
编码成我们的接省数据,我们这一块呢,看到了,看到了以后呢,接下来他拿到了一个re return,我们的重试器,好,我们来运行这个重试器是什么呢?我们看到这一块拿到的这个重试器,它是一个内部类什么DOLLAR1好我们一会用到再说,它先在这execute and decode有执行以及解码,相当于呢,他这一块会来远程执行我们请求,然后呢,再将我们响应拿过来,将响应数据进行解码,整个解码完以后呢,返回我们的object对象,那这里边就是份的整个执行功能了,我们可以step into进来看一下,那么现在呢,先来到target给他request,他先在这请求目标请求,他用我们之前构造的tablet,里边有我们将要给哪发请求,用什么请求方式,用什么请求地址,包括我们的整个数据,杰森那么之前呢也已经看到了,在这view按string的时候,这是一个杰森,它呢将会通过。
14:22
这些来构造出这个请求,然后呢,把这个请求来发送出去,而且他在这一块有日志记录,如果我们有日志的话,它也会记录,包括呢,在这一块就是真正的执行client execute,那就是利用我们的叫load balance份client,我们看到这是一个负载均衡的份客户端,相当于呢,它会真正的负载均衡的去来给我们执行这个请求,该调哪个服务来调用哪个服务执行请求呢?那就是发送。Post请求的这个过程我们就可以不用看了,我们来直接给它放行,来看一下这块的执行,那么一放行呢,我们就来到了elastic的我们save controltrl了,那说明我们上一步的这个放行我们就会执行到远程接口,所以来到我们这一块,那远程接口呢,我们来看一下走,那将准备好的这些数据我们来看收集过来,而且呢,这一块也都没问题,也都逆转好了。
15:19
这块能逆转好,这是得益于spring mvc,因为我们说这叫request body,意思是请求体,那别人给我发的请求,请求体里是杰森spring mvc自动的将它封装好,那发请求呢,是得益于我们的份的这个method handler。他在发请求之前会将我们这个数据编码成杰森,然后发给我们,我们用杰森再收起来,好没问题,然后呢,我们在这一块就会调用我们商品的上架方法,那这个是上架呢,就会给我们的ES来发送请求进行上架,好我们来运行,我们来到我们的这个断点,上架方法的第一个断点,它构造一个批量请求,批量请求完了以后呢,我们在这儿会发送一个批量操作,批量操作整个结束以后,我们就上架完成了,那这一块的构造我们就可以不用看了,也比较简单,我们来到这儿让他进行上架,那上架完了以后呢,我们就要判断是否成功还是失败,好我们给这打上断点来放行走,我们发现呢,在这log个L打了一个。
16:21
错误日志这一块说商品上架错误,我们这几个商品12345678,那都有问题,那这块的打印呢,是我们service里边的打印这个错误,想要知道是什么原因,我们也可以从这个bug里边能获取到,Bug里边有一个方法可以get到它的错误消息,好那这一块呢就可以不看了,能出现这个错误的原因,我们先来看一下我们的K班以及ES有没有启动我们5610,我们的9200端口走。我们ES呢是启动好的,包括我们来看我们的K班的192168,我们来写56015601走。
17:06
我们来到这一块的控制台,是我们这个div兔子,我们来看这个控制台里边我们product这个索引下到底有没有数据。我们来直接get,我们如果上架了,就会在product索引下保存有数据search来运行。我发现呢,这确实已经有了八个商品,那说明这些都上架成功了,每一个数据呢,保存进来。包括ID也是我们指定的SQ的ID,来看一下SQ的idsq的信息,在这呢都有。那至此呢,我们远程调试整个的上架功能也算是结束了。我们在这收集的上架错误,这不算是上架错误,因为我们只是从所有的响应里边拿到这个ID,能拿到这其实是上架成功,如果真的远程接口这一块有执行错误,比如我们的ES连接不到,根本就不可能走到这儿,所以呢,我们在这儿就打来打印上架完成,把我们这一块虽然打印上架错误,我们发现controller呢,没有打印ES controller上架错误,那说明是上架成功的。
18:10
好,那么在这一块呢,把这个日志就写好,不要引起我们这个歧义,好,我们就叫上架完成log info。那么这块呢,就调试完了,那在调试过程中,我们也看到了份来进行调用的整个大致过程,他会先构造出我们这个请求,准备好数据,并将数据转为JS,完了以后呢,在这儿执行,那执行有问题,他在这儿就会来抛异常,包括呢,执行之前我们也看到这儿,在这个执行的时候,他做了一个叫R重试器,如果这块有执行异常重试器呢,还会在这continue,也就是说继续来进行重试,所以我们之前给大家留到的一个这个功能,我们来给大家看一下,留到这一块,诶会不会重复调用,会不会有重试机制,诶我们发现呢,源码里边是有,但是有没有被调是一回事,那么整个份的调用流程,那们在这儿呢,也正好梳理一下它到调用流程呢,就是第一步构造。
19:14
请求数据。将咱们这个对象转为JS,第二个发送请求进行执行,进行执行,它们对应的方法都是什么?我们可以来到这儿,在执行之前,他会先来构造一个请求的模板。在这一块呢,它就已经将数据转成了杰森,好,我们来放到这儿,大家想看源码呢,那就在这一块的位置,第二个发送请求进行执行,执行呢,那就在这一块的位置,叫execute and decode,它是执行并且解码。也就说执行成功以后要解码我们的响应数据,执行成功会解码。我们的响应数据,那它呢,就是在这个方法里边来执行的,但是在这个方法执行的时候呢,我们发现执行这个方法的外边有一个叫瑞串,它在这进行尝试器,而且这是一个V处,我们先来尝试执行这个方法,如果有异常了,我们用尝试器来测试继续来执行,如果尝试器相当于允许能继续执行了,它的这个继续执行,我们可以来点进它的实线看一下。
20:26
这个尝试器呢,是一个接口,大家也可以自己来写这个实现,它这里边提供了两个默认实现,一个叫default default进行重试的时候,会来到这个方法,他又重试的最大次数,如果超了这个次数抛异常,那说明重试结束,没超这个次数,我就在这为尔循环,一直循环,第一次没朝这个次数,一切正常。这个方法不抛异常,看尺不往下走,不往下走不抛异常。那最终呢,就是卡相当于V循环继续,相当于再来执行一遍,如果我们重试器还没有跑异常,再来执行一遍,这就是无限重试,当重试呢,有我们最大次数,我们可以写这个重试器自己的实现,这里边呢有一个default,它默认最大重试这max max在构造的时候呢,传了一个五现,当默认,默认最大重试五次,但下边呢,还有一个叫memory串,从不重试。
21:23
这个重试器呢,如果调用它的重试方法,会直接抛异常,所以呢,在这如果用的是第二个never try,它在这一尝试进行重试就会抛异常,只要一有异常,他把这个异常呢,直接拉着也抛出去,一抛出去我们的V循环就结束了,相当于我们只执行了一次,所以呢,我发现这一块确实有重试机制,诶我们是用这个重试器来做重试机制,好我复制一下。执行请求,执行请求会有我们的重试机制,只不过我们现在没有触发,因为重试机制呢,默认是关闭状态的,好,它的整个源码的核心是VR处,VR处里边呢,这是我们的重试器,它先串来执行,来执行我们真正的方法,这个方法呢就在这儿,然后呢执行,如果这个方法呢。
22:16
出问题了,相当于没执行成功,他还会在这儿呢进行重试。我们叫catch,它利用重试器进行重试,而且这个重试器呢,如果抛异常这个东西有异常,它会把异常抛出去。Through。Ex,如果这个东西呢,没异常。它呢就会continue,那1CONTINUE相当于我们VR继续就会继续来进行执行,那么这一块的核心放在这儿,好这呢这个呢也是一个串,那我就来写上我们的尾代码来写一个串。大括号。有异常,Catch它也会呢,把这个异常直接抛出去,所以只要重试器不允许重试,什么时候重试结束了,抛一个异常就行了,那么这个重试呢就结束了。
23:09
那这样呢,我们这个接口就调通了,商品呢也已经上架过来了。
我来说两句