00:00
前边我们处理了s pou基本信息,以及squ的一些基本信息的保存,由于这些保存呢,都属于商品服务product,而且也都操作商品数据库,我们这个PMS,所以我们在一个service里边调用其他service,我们都可以保存成功。那接下来呢,由于几个保存,比如SQ的积分信息,还有SKU的相关优惠信息,我们本服务呢已经不能处理了,需要交给我们其他的服务,比如我们这儿有一个优惠券与积分服务,那这个服务呢就应该来保存这些信息,所以我们这一块就牵扯到需要调用远程服务才能完成整个功能,那想要调用远程服务,我们以前在这儿测试过,用份来调用,首先保证这么三点,第一点远程服务必须上线放到注册中心中,我们在这个远程服务carbon里边,我们来看一下,我们在之前测试的时候呢,已经将它加入到了配置中心,而且还加到了注册中心中去,我们在配置中心里边直接都有注册中心的相关地址。
01:00
等等,这是要保证的第一点,第二点,我们这个远程服务一定要开启服务注册和发现功能,那这样的话就是相当于把自己才能真正的注册到注册中心,那有了这个别人想调调用它,那以前用member测试过,别人想要调用它呢,只需要保证它首先也得在注册中心中,然后呢,他就可以去注册中心中找到它所在的位置,那想要调用我们只需要写一个接口就行了,那以前呢,在这写过份的接口来看,这有一个份的接口,在这个接口上呢,声明一下,我们是想要调用哪个服务的,哪个请求对应的这个方法,当然要想要进进行远程调用我们的本服务,就像我们说的,首先得在注册中心中,其次我们一定要开启远程调用功能,所以呢,我们现在优惠服务我们已经做好了,我们前面测试别人已经能调了,那现在就是我们商品服务要来。
02:00
调用优惠服务,那想要调呢,我们肯定得启动,还得加到注册中心中,这样才能供别人来调用好,我们现在来启动优惠服务,在这个卡里边,好,我们把它run起来,然后呢,我们来到商品服务里边,我们将所有要远程调用功能的这个接口,我们都写在另外一个包,我们就叫份,这个包下好创建一个新的包叫份,那在这呢,首先我们要调用的第一个功能,那就是保存商品的PU相关的信息,我们还是来到这儿好,我们这个远程服务呢,让他正在启动就行。我们来到我们的info service里边,首先对于来说我们要保存PU对应的积分,那远程接口呢,其实在carbon里边可能呢有一个功能。这个功能呢,有专门对应的s pou积分的这个controltrler,这个controltrler呢,可以来做一个保存操作,比如它保存的是我们s po的这个积分,Po的ID是多少,成长积分等各种积分是多少,它来保存的,所以呢,我们这个粪最终想要调用的就是这些功能,好我们先来写第一个叫SPU份这个service,那只要这些service加了份,那就是进行远程调用的这些服务,好我们这个呢,必须是一个接口,而且呢,既然是来调用我们优惠券服务的,那我们也可以把这个改个名啊,这叫SPU有点不形象,那么是来调用优惠券服务的,那么就可以写一个叫carbon service。
03:34
那这个phone service呢?首先需要第一个功能叫ant phone来声明一下,我们是来调用哪个远程服务,将远程服务的名字写在这儿,好,我们放在这儿。其次呢,我们这个服务一定要开启远程调用功能,我们在这呢需要使用一个注解叫enable分clients,这个分clients呢,你还可以写上一个叫best packages,明显的来告诉spring cloud,我们这些份接口都处在哪个包下,就算我们不告诉,它也会自动扫描到我们这些标注了分client这些注解的这些接口,当然能扫描到它们的前提,那就是我们的这个主配置类,它所在的包是一个副包,其他都是子包,那就能扫描到子包里边了,如果自己是写了另外的一个配置类,在那个配置类上标注了这个功能,那么他呢,可能副词不同包,那我们就一定要显示的声明,那这个声明好了以后我们在我们的s spo service里边,我们就指望它来帮我们来进行远远程调用好,我们来只需要注入这个carbon。
04:43
Carbon份service,我们这个就叫carbon份service at一个auto,它呢帮我们来调用远程的所有功能,首先来第一个功能,比如我们来保存商品的积分,那希望它有一个方法。将save PU棒子这个功能,然后呢,将我们相关的信息传过去,传给远程服务来进行调用,那这一块传什么?其实我们远程服务想要保存po的积分,首先得知道的ID,以及它的成长积分、购物积分,而成长积分购物积分好说,那就在我们这里边封装着,我们这儿有一个VO,这个VO里边有这个成长积分和购物积分信息,都在这个棒子里边,我们可以看到这个棒子,这个棒子里边有成长积分和购物积分,但是呢,我们还要额外提交po的ID才算一个完整数据,所以我们现在又有一个领域对象模型,我们来看A服务要给B服务传数据,这些数据呢要发送出去,我们可以将这些数据封装成一个对象,特别在spring cloud里边,我们封装的这个对象要给B服务传spring cloud会把它默认转成一个JS,然后B呢会收到这个。
05:59
S数据,然后把JS呢,B也可以逆转成一个对象,所以在整个传输期间,我们的这个数据模型我们可以称为一个叫to,由于to啊是A要往出传,B要接过来,相当于AB是都要用的,所以我们建议把to可以放在。
06:17
Common里边好,我们在这个common里边呢,专门来放一个to,我们在这儿来写一个to的包。那所有的to呢,我们全放在这儿,现在我们需要一个po的这些积分,这个to,好,我来准备一个to,我们就叫po棒子to,这个to里边。数据主要是这么几个数据,首先远程要用哪些,我们肯定都知道,我们现在有一个浪浪类型的po ID,远程需要这个po的ID,还有他的两个其他积分,我们把这两个积分信息我们也复制过来。把这个积分。BY棒子和group棒子,把它呢也放到to中,那这就是我们这个to,那我们就可以在这构造出这个to传出据,那先把这个棒子数据拿过来,然后呢,我们来拗一个SPU的棒的to,把这个to呢准备好,然后传给这个调用远程服务的这个service,然后这个呢,我们必须属性对拷过来,Being u copy properties。
07:30
将我们页面提交的这个积分,然后呢交给我们to这个数据传输对象,这个数据传输对象里边更关键的一个点就是我们要设置po的ID po的ID那就是这个英fo n get ID。好。那我们就希望有这么一个方法,它能帮我们来调用远程接口,当然我们这要调用远程接口,我们就得指定我们这调用的是哪个远程接口,包括发送什么请求,那么首先得假设我们这远程接口有一个功能,那在卡里边,好,我们呢,假设在它的这个PU棒子,在这个controller里边。
08:12
有一个功能叫save,它能保存这个积分,这个功能里边呢,Po ID和这两个我们都有,而且呢,这个积分也有它的生效情况,比如我们买一个东西,已经参加优惠了,我们可以不想给他赠送购物积分,或者想给他赠送购物积分等等,会有各种情况,所以这些情况呢,有我们在这说的什么四个状态位,比如从右到左这一块的零一,如果零就代表无优惠成长积分是否赠送,那这就是第一个位置,如果写零,那就是不赠送写一,那就是无优惠成长积分赠送,而第二个位置是有优惠,我们的这个购物积分是否赠送,如果这块写零,那就是无优惠,无优惠购物积分不赠送写一,那就是无优惠购物积分赠送,然后这一块呢,那就是有优惠。
09:01
有优惠的情况下写零,比如成长积分不赠送,写一成长积分赠送,那这个就是有优惠的情况下写零,购物积分不赠送,写一购物积分赠送,最终这些其实就是二的四次方种情况,当这个留给大家扩展,大家可以去来考虑这么多的情况,我呢就来直接在这儿使用,所以我们会发现在s po棒子这个ctrler里边,本来呢有一个默认的保存方法,那我们远程的接口如果能调用它,那其实就可以了,所以想要调用它也非常简单,首先保存是一个post,那我们也可以将它的整个请求路径我先复制过来,我们就叫post map屏,当然所有的返回都是一个R对象,我们能知道成功还是不成功,当然完整的路径啊,我们一定得复制过来,它的完整路径在这卡,SQ棒子在这儿,然后呢,我来帮大家捋一下整个逻辑,在这一块有一个非常重要的注解叫response body,相当于我们要跟远程的接口保证。
10:02
完整的签名,所以远程的接口这一块也得变成这样,我们把这一块呢变成它。所以我们这么一看就知道carbon service它这个方法调用的是远程这个服务的这个请求,那这个请求呢,最终是在这个CTRL里边里边找到,找到这然后呢,Request body就是将传过来的接S转成这个数据,那就是我们这个样子,所以我们将这一块的签名呢,就完整复制过来,其实我们如果不完整复制行不行呢,你看。我在这发数据的时候用了Q棒的to,我在这切数据用了Q棒s entity行不行呢?我们来给大家捋一下spring cloud整个远程调用的逻辑,我们就知道,首先逻辑如果我们有一个service调用了这个carbon service的这个方法。
11:00
然后呢,还给他传了一个对象,注意这是传一个对象,而不是一个基本路类型的数据,那传了一个对象,Nice cloud就会做的第一步,将这个对象,将这个对象。将这个对象转为。怎么转呢?那就是我们需要有这个request body注解,只要有这个注解,它就是将这个对象转为杰森,那转为杰森以后呢,第二个那就是spring cloud会给我们远程的这个服务发送这个请求,它会找到这个远程服务,找到这个服务,当然它是去注册中心中找的,找到这个服务,给服务的这一块发送请求。当然发送请求的时候,它会把这个转成的对象的这个接放到哪个位置呢?由于你标了request body,所以呢,它会将上一步上一步转的对象。
12:03
转的结实。转的结实放在。请求体位置。位置,然后呢发送请求,所以给这发请求的时候呢,它是将上一步转成的这个阶色放在请求体位置的,然后接下来第三步,那如果我们发出去第三步实际上就是我们外边的这个接收到请求了,那就是对方服务,对方服务收到请求,收到请求啊,对方服务其实收到什么了,其实收到的是请求体里边的接S数据请求题里有接省数据请题里。有咱们这个杰森数据,然后呢,关键对方服务又写了一个这样叫response body,它的这个作用就是将请求体里边的杰森转成它,所以它是将请求体的杰森转为这个类型,其实能不能转,能转完全没问题,只要我们上一步转的这个杰森里边的属性名跟我们最终要转的这个对象的属性名有一一对应,它就能可以封装。
13:20
而不一定非要我们传的to是这样,现在我们传出去的数据是这样,那你接收的数据就必须用我这个类型,这是没有这个死规定的,因为我们最终都是将杰森转成它的,所以说只要我们这一块写的这个能对应了这个杰森也是可以的,所以给大家最终一个总结的这个功能,也就是说只要只要我们这个接S数据模型,数据模型是兼容的。是咱们这个兼容的,我们双方服务,双方服务无需使用同一个体,同一个to,就是发的时候用它,你接的时候也必须用它。其实在开发为了简单,我们说要调用远程服务啊,你最快的方法就直接是将远程服务的这个接口的声明直接给这咔一放就完事了。但是呢,仔细说起来,我们只需要对应好远程服务的请求路径,以及数据的封装格式,包括最终响应数据,只要数据模型都是一样的,能封装就没什么问题,好把这一块去掉。
14:34
那我们就寄希望于远程的这个方法帮我们来保存商品的积分信息,那我们这一块商品的积分就保存了,那剩下就是SKU的这个信息,那这个Su,那我们同样也来写一个to加SK,所有的信息我们都交给这个远程的优惠服务,让他来保存SQ的这些优惠,好,我们在这来写一个to。
15:00
这个to呢,我们就叫sqsq reduction。好,我们这SQ的优惠信息,这个里边不仅有它的积分,还有很多信息,好我们把它呢,整成一个class。来把这个to往我们往出传,那我们在这来看一下SQ的满减信息,这个满减信息我们来找到当前这个SQ,那将他所有的优惠信息我们全复制来,这是它的满几件打几折,以及满减是否叠加其他优惠包括在这,包括呢这一块也有它的会员价格,我们先CTRLC,它的这个to里边这几个基本的放在这,包括整个会员价格信息,这个会员价格这个list,那我们直接将这个会员价格也提过来,把这一块。我们也提过来,它里边呢也要包含,所以我们将这个VO里边的member price,我们给to里边也放一个。
16:04
好,那最终我们这个SQ reduction to里边,这是满减,这是打折,还有我们的这个会员价格,我也复制过来,把它放在我们这个to里边,当然所有的这些设置,最重要的就是SQ的ID private浪类型的SI。我们一个贝塔。所以我们在这。我们需要呢,有一个方法能保存这些优惠信息,我还是用这个远程接口carbon service,第二我们就叫save SKU reduction。我们让它呢,传一个to过去,我们又一个SQ的这个to,扭一个SQ reduction to,好把这个to放过去,好我们把它传到这,然后这个to里边有什么数据直接对拷过来,当前正在遍历的这个S,我们就叫item,我们来直接对考being优s.copy properties item,你像item里边的数据拷到这,那item里边跟它的这些属性都是一模一样的,包括它那唯一没有的就是这个SQID,所以我们在这来设置上SQ ID SQ reductionq.set SQ ID。
17:20
这个ID呢,就是上一步我们来保存SKU给我们产生的SQID。那最终这个to有了以后,我们这个远程接口啊,就会有这么一个方法,但这个方法所有的方法都是返回啊,同样的,我们将这个东西你杰森传递过去,把它放在请求体中,Request body,那就是将它转为杰森放在请求体中,那给谁发请求呢?我们来写一个post。那假设给SQ里边某一个功能来在远程接口里边来打开。这有一个叫SK for reduction controller,那么就给他发请求吧,那来自己来写一个方法,Public r现在没有现成的方法可以使用了,由于我们那个to里边既封装了满减,还封装了折扣,挺多信息的,这只是一个满减打折。好,我们现在呢,来写一个post map,我们就叫SQ for reduction save info。
18:25
好,我们来保存详情的,这个整个的保存我们就叫C英法,但由于我们份客户端调用,我们会传这么一个to,而且这个to里边数据封装的比较多,是各种实体类里边都集合了一些数据,所以我们的这个远程接口我们也不用管那么多了,我们就直接将这个to写在这,跟他保证数据一致,你叫SK reduction to,然后在这个to里边呢,我们就希望有一个service,比如SQ for reduction service.save SQ reduction。
19:04
然后呢,将这个to传进来,我们就来保存SQ的所有详情,那这个只要保存成功,你就返回,OK。那我们来把这个远程接口来写一下这个carbon service最终会调用这个接口下到我们这个功能。那这个功能呢,接收来他这个类型的数据,而且我们在这来给它处理完来创建出这个方法。我们来创建出它的实现,那这个功能里边也非常多,首先在这里边前三个,这是打折信息,满几件打几折,以及打折是否叠加其他优惠。所以我们在这。打开他的视线。在这呢,也分为三步,第一步保存它的这个保存满减打折,满减打折。还有我们这个会员价,那最终就是我们这一块的service里边来找到。
20:07
Po英镑service里边。我们最终就要保存这些的。CTRLC复制过来。好,首先准备第一个是它的阶梯价格,也就满几件打几几折,包括我们这个满多少减多少,那我们各自就要用各自的service,我们就有一个SQ叫linder这个service,我们把这个service呢,先来自动注入at一个owa,那它里边呢就有一个方法叫save,这个save呢,我们需要这么一个实体类,有一个SK这个实体类,这个实体类里边我们将这些数据先封装过来,那在这SQ lnder n点一个set SQ的ID,那SQID,那就是我们这个reduction里边传过来的这get SQ ID。
21:04
包括呢,我们这里边还有两个,一个是满几价,一个是打几折,还有我们这个折后价,折后价我们就直接可以在这进行一个计算,那么这个SQ lnder n.set一个满几件,那就是我们这个to里边拿到这有一个满几件,包括打几折sqnder n.set discount。我们打折放在这点一个get discount,还有是否叠加其他优惠,点set and other,这reduction to里边有一个get count status,那就是打折的这个状态,是否参与其他优惠,包括最重要的这个我们来计算一下点set一个折后的价格。当然这个折后价格是根据SKU的价格来计算的,而且SQ的价格每次都会变,我们可以第一次上来的时候给他算一个折后价,我们也可以在下订单的时候最终给他算折后价都行啊,我们就放在这,然后这个完了我们就可以来给他做一个保存,好把这个基本信息就保存了。接下来第二个我们首先保存了一个SQ的这个lender信息,我们的这个阶梯价格,然后接下来我们再来保存一个。
22:17
我们这个满减信息for reduction,好,我们希望有一个满减的service SQ for reduction service,那就是他自个了,那么就不用自动注入了,你就直接来调用它的保存方法,This save,这个保存方法呢,当然还是得有一个,你有一个SKU满减的这个实体类,它最终都是要保存数据库对应的这个实体类。那这一块的保存数据满多少减多少,是否叠加其他优惠以及SQID,我们还是利用属性对拷,那其实前面这个也直接可以利用属性对拷就完事了,好,我们来being us点一个copy properties,我们原数据就是这个to对拷到我们这个实体类里边。
23:05
这里边两个属性都是一一对应的,包括SQID,那对拷完了以后呢,在这一保存下来,第三步还有我们的会员价格,这个会员价格呢,我们有很多,我们都可以在这来获取一下,首先reduction to里边点一个get。它有一个叫member会员价格。这个会员价格呢,最终我们要用会员价格的service,我们叫member price为o member price service对price service,把这个会员价格的这个service拿来点一个owa。好,我们在这调用一下会员价格,点一个我们最终的这个save,因为有很多我们就叫save bench。这个办呢,每一个都应该是我们这个member price entity,所以我们就将这个直接给它处理一下stream.map首先我们这个item当前这个数据,我们先new一个member price entity。
24:07
啊,先创建出来。然后呢,我们将属性先对拷过来,Being us.copy properties,首先我们来看这些属性有没有一一对应,首先这有SQID,还有会员的等级ID,会员等级名字和会员价格是否叠加其他优惠发然这几个属性呢,都没对应起来,那我们就不用在这属性拷贝了,我们一个一个设置点一个set,首先sqidd,那就是我们这个to里边的拿过来点一个get sqidd,然后接下来price entity,点我们的member level ID,我们这个会员等级的ID,在item里边点一个get ID,这个ID就是会员等级的ID,还有price entity.set。Member level name,我们这个会员等级的名字,Item里边这个name就是会员等级的名字,然后当前等级对应的价格点一个set member price会员价格,那就从item里边拿到点get一个price,然后再从price里边点set是否叠加其他优惠,那么可以写一个默认都来叠加其他优惠。
25:15
最终呢,将这个return出来,Price entity,我们把它收集成一个几何collect to list。最终我们将这个数据来进行封装,我们把它在这来批量保存。那么这个远程接口就写好了,那至此呢,我们商品服务里边要调用的所有功能,那么在这该调用远程服务的我们也调用了,包括呢,该做基本保存的我们来都做了,特别是这个远程服务在调用完了以后呢,它会返回一个R对象,如果你想要记录远程到底是成功还是失败了,你可以在这判断一下,如果r.get code它是零,说明就调用成功了,只不过这个R我们来看一下,它是一个map。
26:01
我们可以来直接get一下code属性,由于经常要get code,我们就来给他来生成上这几个简单的方法,好,Static。我们就加get Co。我们来return的是我们当前的这个get code的值,Get一个我们这个code,当然这不用static,那么这个code呢,都是一个数字,比如放零放一,所以我们在这儿可以将这个get来的code,我们用inte.pass in来给它转成一个数字。最终我们将这个数字来返回。这就是我们的code。但把线呢强转成string。然后我们在这应该判断,如果R点。Get code是等等零的,那说明没有任何异常。如果不等零,我们也可以在这来记录一下,比如log l。
27:01
点L,那就叫远程服务,远程保存PU优惠信息,主要就是它的这个积分信息失败。包括在下边儿,我们也都可以来记录一下。我在这儿下边呢,也会调用我们这个远程服务,最终呢,都会有一个返回结果,我们在这儿来判断一下,只要这个返回结果有问题,我们就可以来远程保存SKUSKU优惠信息失败,好,那至此呢,我们这些方法就写好了,那下一节课我们来做一个整体测试。
我来说两句