从头撸一套基于微服务的下单支付过程

「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战

在前面的文章里,我们逐步的搭建了一套基于springCloudAlibaba的微服务框架,里面整合了依赖管理组件maven,接口文档管理工具knife4j,持久层框架mybatis-plus,以及代码生成器mybatis-plus-gennerator,还针对不同的环境配置了不同的配置文件。这环境不能白搭,所以我们现在就用这套服务来搞点事情,在发现问题时,我们再通过代码的优化,或者其他组件的引入来逐步优化它。不断地融入新的东西,使其变得壮大。

在本文之前,有一些基础的组件集成,环境搭建,希望大家能够耐心看完,然后可以参照本文实现一下。

文章所有内容都在此专题当中:juejin.cn/column/7053… 建议新手先行学习

本文项目代码gitee地址: gitee.com/wei_rong_xi…

一、规划

1.1 业务规划

我大概是这样想的,做一套高并发场景下的微服务,从现在的代码为基础,模拟大量下单的场景,不断的发现问题,优化问题。所以,我现在给这个服务规划了几个模块如下:

未命名文件 (3).png

流程从上至下:

  • 用户服务挑选货品
  • 货品选择完毕后下单
  • 订单完成后去支付
  • 支付完成去用户账户扣款

1.2 服务规划

所以有如下的服务模块划分:

image.png

从上至下分别是:

  • 账户服务
  • 网关
  • 代码生成服务
  • 商品服务
  • 订单服务
  • 公共starter
  • 交易服务
  • 用户服务

1.3 数据库规划

数据规划暂时是一个库多张表的形式:

image.png

从上至下分别是:

  • 代码生成规则表
  • 商品表
  • 订单表
  • 订单详情表
  • 交易表
  • 用户表
  • 用户账号表

以上就是简单的业务,代码及表结构的规划,下面我会用最简单、最直给的方式去将这个业务线完成。

二、调用流程分析

我会模拟下面用户购物的一个流程如下所示:

未命名文件 (6).png

其中测试服务就模仿我们的应用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>
复制代码

代码生成过后就是这样的格式,以订单服务为例:

image.png

验证代码生成后服务是否正常启动,在nacos看:

image.png

在接口文档看生成的接口是否正常,除网关外六个服务,整整齐齐:

image.png

用订单服务接口列表:

image.png

3.2 创建服务调用Client文件夹

我们在代码生成的时候,生成了自己服务的client接口,用于供其他服务直接调用。

如果其他服务需要调用某个服务就要把该client接口复制到自己的client文件夹当中。同时也要将其DTO一并拷贝过去,因为代码生成的接口参数都是DTO的。

如在用户服务添加订单服务的client接口:

image.png

下面我们按照前面的流程图,把需要相互调用的服务的client都配好,过程不展示了。

3.3 业务流程代码实现

3.3.1 构建一个测试服务

构建一个测试服务,用来跟网关进行交互,调用业务服务。

测试服务会干以下几件事:

  • 调用用户服务,获取用户信息
  • 使用获取的用户信息去查询并绑定商品信息
  • 使用用户和商品信息进行下单
  • 查询订单信息并支付

测试服务使用Hutool的http工具进行调用。

3.3.2 下单流程

因为是测试代码,所以与真正的下单流程略有不同,我们按照前一小节的顺序完成下单流程调用,本文代码目前只支持一个订单同一个商品,但是可以多个。

抢年货-下单流程.png

3.3.3 支付流程

当用户下单后,用户需要根据订单号对订单进行支付。

抢年货-下单流程 (1).png

四、测试

经过前面的设计和研发,基本的下单和支付功能已经实现了,下面简单测试一下。

我这里的用户和商品,以及购买的上平数量都是随机的。

4.1 数据初始化

  • 表结构sql

    image.png

  • 创造测试数据,在用户服务,用户账户服务,商品服务的控制器当中,都有一个测试方法,用来生成数据,同学们可以自行的执行该方法创造数据。

    image.png

    image.png

    image.png

4.2 测试

  • 创建一个订单:

    测试服务调用http://localhost:8010/test/order 创建订单,返回订单号。

    生成订单和订单详情如下:

    image.png

    image.png

    商品信息,初始是100w,减少一个:

    image.png

  • 支付这个订单9

    测试服务调用测试接口:http://localhost:8010/test/trading?orderId=9 返回结果如下:

    image.png

    订单信息状态已改变,如下所示:

    image.png

    交易订单如下:

    image.png

    用户账户信息:

    image.png

五、总结

本篇文章算是暂时将前面集成进来的东西,按照一定的业务逻辑使用起来了,算是对前面的一个总结。

但是也是对后面扩展的一个开始,此工程会不定时的更新、集成新的内容。

适合新手,想学习微服务的同学学习,不会的东西可以参照源码,或者直接评论问我。

文章所有内容都在此专题当中:juejin.cn/column/7053…

本文项目代码gitee地址: gitee.com/wei_rong_xi…

Guess you like

Origin juejin.im/post/7065852853658583054