乐趣区

关于golang:微服务从代码到k8s部署应有尽有系列六订单服务

咱们用一个系列来解说从需要到上线、从代码到 k8s 部署、从日志到监控等各个方面的微服务残缺实际。

整个我的项目应用了 go-zero 开发的微服务,根本蕴含了 go-zero 以及相干 go-zero 作者开发的一些中间件,所用到的技术栈根本是 go-zero 项目组的自研组件,根本是 go-zero 全家桶了。

实战我的项目地址:https://github.com/Mikaelemmm…

1、订单服务业务架构图

2、依赖关系

order-api(订单 api)

  • order-rpc(订单 rpc)
  • payment-rpc(领取 rpc)

payment-rpc(领取 rpc)

  • mqueue-rpc(音讯队列)

order-rpc(订单 rpc)

  • mqueue-rpc(音讯队列)
  • travel-rpc(民宿 rpc)

3、订单举例

3.1 下订单

1、用户在去浏览 travel 服务中的民宿 homestay 看中抉择日期之后要下单,调用下单 api 接口

app/order/cmd/api/desc/order.api

// 订单模块 v1 版本的接口
@server(
   prefix: order/v1
   group: homestayOrder
)
service order {
   @doc "创立民宿订单"
   @handler createHomestayOrder
   post /homestayOrder/createHomestayOrder (CreateHomestayOrderReq) returns (CreateHomestayOrderResp)
   
   .....
}

2、order-api 中调用 order-rpc

3、rpc 中校验条件创立订单之后,会调用 mqueue-rpc 创立一个提早敞开订单的音讯队列

4、mqueue-rpc 提早队列

提早队列是用的 asynq,asynq 是基于 redis 的高性能队列,同时反对音讯队列、定时队列、固定周期队列,然而咱们这个我的项目为了演示 go-zero 官网的音讯队列 go-queue(go-queue 是基于 kafka 的),所以音讯队列用的 go-queue,提早队列、定时工作用 asynq。这里留神,这里只是往提早队列增加提早工作,具体执行不在这里,那咱们去看看 20 分钟之后具体执行的代码,在 app/order/cmd/mq

5、提早 20 分钟执行的工作队列

在 app/order/cmd/mq,这里我要阐明一下,go-zero 官网 goctl 反对生成的服务目前是 api、rpc,目前临时还没有反对 console、mq 等,然而 go-zero 提供了 ServiceGroup,不便咱们治理咱们本人任何的服务,所以在 mq 中我是用了 ServiceGroup 治理了服务,这也是官网举荐的应用形式,代码如下:

1)app/order/cmd/mq/order.go 首先咱们看 main.go

func main() {flag.Parse()
    var c config.Config

    conf.MustLoad(*configFile, &c)
    prometheus.StartAgent(c.Prometheus)

    serviceGroup := service.NewServiceGroup()
    defer serviceGroup.Stop()

    for _, mq := range listen.Mqs(c) {serviceGroup.Add(mq)
    }
    serviceGroup.Start()}

ServiceGroup 能够增加任何 service 进去,然而如何成为一个 service 呢?那你就要实现两个办法一个 Starter、一个 Stoper

2)咱们在 main 中能够看到循环 listen.Mqs(c),那咱们看看 listen.Mqs(c) 都有哪些

咱们不止要监听 asynq 的提早队列、定时队列,前面咱们还想监听 go-queue 的 kafka 音讯队列,在代码上咱们思考不想把 go-queue 的 kafka 音讯队列跟 asynq 的提早队列、定时队列放到一起去,所以这里做了个分类

3)asyny 的提早音讯队列

定义 asynq

定义路由

具体实现逻辑(敞开订单逻辑)

所以咱们启动这个 order-mq 的时候,asynq 就会被加载、定义路由,当咱们之前增加的提早队列到了 20 分钟,就会主动执行敞开订单逻辑,如果订单没有被领取,这里就会敞开掉订单,领取了就疏忽掉了,这样就能够不必应用定时工作轮训敞开订单了,哈哈

3.2 订单列表

没啥逻辑,就是查出来显示罢了,本人看一下就好了

// 订单模块 v1 版本的接口
@server(
   prefix: order/v1
   group: homestayOrder
)
service order {

   @doc "用户订单列表"
   @handler userHomestayOrderList
   post /homestayOrder/userHomestayOrderList (UserHomestayOrderListReq) returns (UserHomestayOrderListResp)
   
}

3.3 订单明细

没啥逻辑,就是查出来显示罢了,本人看一下就好了

// 订单模块 v1 版本的接口
@server(
    prefix: order/v1
    group: homestayOrder
)
service order {

    @doc "用户订单明细"
    @handler userHomestayOrderDetail
    post /homestayOrder/userHomestayOrderDetail (UserHomestayOrderDetailReq) returns (UserHomestayOrderDetailResp)
}

4、结尾

下了订单,当然咱们要领取了,那就看下一篇领取服务吧

我的项目地址

https://github.com/zeromicro/go-zero

欢送应用 go-zerostar 反对咱们!

微信交换群

关注『微服务实际 』公众号并点击 交换群 获取社区群二维码。

退出移动版