从头撸一套基于微服务的下单支付过程
「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战」
在前面的文章里,我们逐步的搭建了一套基于springCloudAlibaba的微服务框架,里面整合了依赖管理组件maven,接口文档管理工具knife4j,持久层框架mybatis-plus,以及代码生成器mybatis-plus-gennerator,还针对不同的环境配置了不同的配置文件。这环境不能白搭,所以我们现在就用这套服务来搞点事情,在发现问题时,我们再通过代码的优化,或者其他组件的引入来逐步优化它。不断地融入新的东西,使其变得壮大。
在本文之前,有一些基础的组件集成,环境搭建,希望大家能够耐心看完,然后可以参照本文实现一下。
文章所有内容都在此专题当中:juejin.cn/column/7053… 建议新手先行学习
本文项目代码gitee地址: gitee.com/wei_rong_xi…
一、规划
1.1 业务规划
我大概是这样想的,做一套高并发场景下的微服务,从现在的代码为基础,模拟大量下单的场景,不断的发现问题,优化问题。所以,我现在给这个服务规划了几个模块如下:
流程从上至下:
- 用户服务挑选货品
- 货品选择完毕后下单
- 订单完成后去支付
- 支付完成去用户账户扣款
1.2 服务规划
所以有如下的服务模块划分:
从上至下分别是:
- 账户服务
- 网关
- 代码生成服务
- 商品服务
- 订单服务
- 公共starter
- 交易服务
- 用户服务
1.3 数据库规划
数据规划暂时是一个库多张表的形式:
从上至下分别是:
- 代码生成规则表
- 商品表
- 订单表
- 订单详情表
- 交易表
- 用户表
- 用户账号表
以上就是简单的业务,代码及表结构的规划,下面我会用最简单、最直给的方式去将这个业务线完成。
二、调用流程分析
我会模拟下面用户购物的一个流程如下所示:
其中测试服务就模仿我们的应用app,它的整个购物流程有如下四个阶段:
- 1- :查询用户信息
- 2- :查询商品
- 3- :下单 -> 查询商品库存
- 4- :支付 -> 查询订单信息 -> 账户扣款
其中每个阶段还有不同的服务间调用关系,我就不说了,都在图里。另外还有很多细节甚至调用,我就不再图上展示了,画的越多,显得越乱。
三、代码编写
有了上面的流程,我们就可以把我们的业务代码写一写了。
3.1 代码生成
现在就是校验我们前面集成代码生成器mybatis-plugin-gennerator和velocity成果的时候,调用代码生成接口,生成zip文件。
上来就翻车了,在前面的文章里没有引入feignclient,在这里加上:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
代码生成过后就是这样的格式,以订单服务为例:
验证代码生成后服务是否正常启动,在nacos看:
在接口文档看生成的接口是否正常,除网关外六个服务,整整齐齐:
用订单服务接口列表:
3.2 创建服务调用Client文件夹
我们在代码生成的时候,生成了自己服务的client接口,用于供其他服务直接调用。
如果其他服务需要调用某个服务就要把该client接口复制到自己的client文件夹当中。同时也要将其DTO一并拷贝过去,因为代码生成的接口参数都是DTO的。
如在用户服务添加订单服务的client接口:
下面我们按照前面的流程图,把需要相互调用的服务的client都配好,过程不展示了。
3.3 业务流程代码实现
3.3.1 构建一个测试服务
构建一个测试服务,用来跟网关进行交互,调用业务服务。
测试服务会干以下几件事:
- 调用用户服务,获取用户信息
- 使用获取的用户信息去查询并绑定商品信息
- 使用用户和商品信息进行下单
- 查询订单信息并支付
测试服务使用Hutool的http工具进行调用。
3.3.2 下单流程
因为是测试代码,所以与真正的下单流程略有不同,我们按照前一小节的顺序完成下单流程调用,本文代码目前只支持一个订单同一个商品,但是可以多个。
3.3.3 支付流程
当用户下单后,用户需要根据订单号对订单进行支付。
四、测试
经过前面的设计和研发,基本的下单和支付功能已经实现了,下面简单测试一下。
我这里的用户和商品,以及购买的上平数量都是随机的。
4.1 数据初始化
-
表结构sql
-
创造测试数据,在用户服务,用户账户服务,商品服务的控制器当中,都有一个测试方法,用来生成数据,同学们可以自行的执行该方法创造数据。
4.2 测试
-
创建一个订单:
测试服务调用http://localhost:8010/test/order 创建订单,返回订单号。
生成订单和订单详情如下:
商品信息,初始是100w,减少一个:
-
支付这个订单9
测试服务调用测试接口:http://localhost:8010/test/trading?orderId=9 返回结果如下:
订单信息状态已改变,如下所示:
交易订单如下:
用户账户信息:
五、总结
本篇文章算是暂时将前面集成进来的东西,按照一定的业务逻辑使用起来了,算是对前面的一个总结。
但是也是对后面扩展的一个开始,此工程会不定时的更新、集成新的内容。
适合新手,想学习微服务的同学学习,不会的东西可以参照源码,或者直接评论问我。
文章所有内容都在此专题当中:juejin.cn/column/7053…
本文项目代码gitee地址: gitee.com/wei_rong_xi…
转载自:https://juejin.cn/post/7065852853658583054