神领物流v2.0-day3-运费微服务笔记(个人记录、含练习答案、仅供参考)
目录
一、前言
二、预估运费
1、模拟实现
2、测试
三、运费微服务
1、拉取代码
2、模板列表
1)导入相关代码
2)测试
3)代码优化
3、新增或更新运费模板
1)导入代码
2)测试
4、运费计算
1)导入代码
2)测试
3)整合到订单微服务
4)测试
5、代码优化-责任链设计模式
1)导入代码
2)测试
四、练习
1、练习一:删除运费模板
1)确认接口信息
2)代码实现
3)测试
2、练习二:查询模板增加缓存
1)代码实现
2)测试
3、练习三(暂时没有想法不做)
一、前言
个人学习记录,已完成练习一和练习二(含答案和测试),练习三未完成
二、预估运费
1、模拟实现
前面的业务需求和实现分析大家跟着视频走就行,下面我主要记录一下代码的实现。如下拉取oms-service的代码,至于后续导入模块及创建develop分支的流程我就不赘述了

找到OrderServiceImpl下的computerCarriage方法,将调用feign接口的代码先注释掉,将文档中模拟实现的代码复制进来。模拟实现就是直接把运费写死为10元

2、测试
在虚拟机连接工具中通过docker stop sl-express-ms-oms-service指令停掉虚拟机中的服务

在本地idea中将OmsApplication、GatewayApplication、WebCustomerApplication三个服务启动,然后打开微信开发者工具。因为oms-service的代码修改了,所以点击一下连衣裙改为2公斤让小程序刷新一下,出现如下图预估总价为10元就测试成功了

三、运费微服务
1、拉取代码
老样子,拉取代码的流程不再赘述

2、模板列表
1)导入相关代码
这部分代码基本都是直接从文档中复制过来,不再赘述

2)测试
将下图的四个服务启动起来,等会基于swagger和前端都测试一下

启动项目后,基于swagger接口进行测试:http://127.0.0.1:18094/doc.html。如下图可见swagger测试没有任何问题

登录管理员前端界面,点击运费管理看到如下图的显示就测试成功了

3)代码优化
导入文档给出的运费模板工具类

将原来转化为DTO对象的代码进行优化。优化完之后重新启动那四个服务再打开前端进行测试,基本是没有问题的

3、新增或更新运费模板
1)导入代码
CarriageController导入代码如下:

CarriageService导入代码如下:

CarriageServiceImpl导入代码如下:



导入文档给出的异常枚举类

2)测试
老样子,测试还是启动这四个服务

测试在存在模板的情况下,新增非经济互寄

测试经济互寄关联城市重复的情况

测试修改模板,将续重价格从原来的5改为10,测试没有问题


4、运费计算
1)导入代码
直接拉取的经济区枚举的代码bug记得改一下并推送上去

导入CarriageController代码如下:

导入CarriageService代码如下:

导入CarriageServiceImpl代码如下:






2)测试
通过swagger进行测试,将如下图的服务启动起来

请求参数按照文档给出的填上去测试,计算出来运费是112就成功了

3)整合到订单微服务
回到之前模拟实现的部分,把feign调用的代码注释解开,然后把模拟实现的代码注释掉

4)测试
重新启动如下四个服务

通过微信小程序进行测试,如下图测试成功

5、代码优化-责任链设计模式
1)导入代码
这部分代码基本都是直接从文档导入的,想研究的自己看文档吧,我就展示一下目录不展示具体代码了

2)测试
还是在微信小程序测试,没有任何问题,后续jenkins部署再测试也没有问题

四、练习

1、练习一:删除运费模板
1)确认接口信息
由于文档并没有给出接口信息,所以我先启动这四个服务然后打开前端看看接口信息

打开管理员前端,点击删除当然会报错。报错信息是Feign调用失败




然后打开idea发现CarriageFeign其实已经存在删除运费模板的feign接口了,只是没有实现而已

2)代码实现
CarriageController代码如下,由于这个接口的功能单纯就是根据运费模板id去删除,所以在这里直接写调用MybatisPlus的removeById方法是可以的。我为了统一就还是controller、service、serviceImpl依次写下去了

service代码如下:

serviceImpl代码如下:

3)测试
重启服务,测试之前先打开数据库看一眼,最下面标蓝的就是黑吉辽的数据

重新打开管理员前端把黑吉辽的模板数据给删除了,显示删除成功,同时前端不再显示该行数据了

重新打开数据库表也可以看到确实数据已经被删除了,没有任何问题

最后记得把数据还原回去

2、练习二:查询模板增加缓存
1)代码实现
在carriage-service的pom文件中引入redis的相关依赖

在boostrap-local.yml文件中加上nacos中redis的共享配置(shared-spring-redis.yml配置在nacos中已经存在)


修改CarriageChainHandler中的findCarriage代码如下,注释非常详细。这里使用的是Redis中的Hash结构,它的层次结构是key field value

修改CarriageServiceImpl的saveOrUpdateCarriage代码如下,这里是为了保证数据的一致性。理论的想法是更新运费模板时删除由key和field确定的唯一的value,但是这里有两个问题。第一是这里的saveOrUpdate是MybatisPlus提供的方法,之前的代码并没有实现区分新增和更新的逻辑。第二个问题是大家可以自己查看WaybillDTO和CarriageDTO,然后就如下注释所分析的,它们两个没有公用的属性字段,所以无论以哪一个字段为field,这里都做不到由key和field确定唯一的value再删除。所以就只能把整个缓存全部删除,不过这部分运费模板本来就不是经常需要新增更新的,所以也说的过去

2)测试
启动如下图的五个服务

打开微信开发者工具,老样子如下图选择连衣裙3公斤,看到左下角预估总价计算出28后,再去查看Redis的数据

打开DataGrip可以看到以carriage:cache为key的缓存已经出现,像这里我因为自己喜欢小写,所以一眼就看出来wechat和这个是我自己实现的缓存。不过这个大家还是按自己喜好习惯来

点进去也能查询到具体的数据

然后此时打开管理员的前端界面,将黑吉辽的续重价格从5改为6,目的是测试更新运费模板是否会删除缓存来保持数据一致性

上面修改成功之后再次打开redis就会发现缓存已经被删除了,测试没有任何问题

