我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。

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

实战项目地址:https://github.com/Mikaelemmmm/go-zero-looklook

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 支持我们!

微信交流群

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

微服务从代码到k8s部署应有尽有系列(六、订单服务)的更多相关文章

  1. 微服务从代码到k8s部署应有尽有系列(一)

    从本篇文章开始,我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 实战项目地址:https://github.com/Mikaelemmmm/go-zer ...

  2. 微服务从代码到k8s部署应有尽有系列(二、网关)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  3. 微服务从代码到k8s部署应有尽有系列(三、鉴权)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  4. 微服务从代码到k8s部署应有尽有系列(四、用户中心)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  5. 微服务从代码到k8s部署应有尽有系列(五、民宿服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  6. 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  7. 微服务从代码到k8s部署应有尽有系列(七、支付服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  8. 微服务从代码到k8s部署应有尽有系列(八、各种队列)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  9. 微服务从代码到k8s部署应有尽有系列(九、事务精讲)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

随机推荐

  1. HDU-2010.水仙花数(C语言描述)

    Problem Description     春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位数,它的各位数字的立方和 ...

  2. JAVA之垃圾收集器

    概述 垃 圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...

  3. 深度介绍Flink在字节跳动数据流的实践

    本文是字节跳动数据平台开发套件团队在1月9日Flink Forward Asia 2021: Flink Forward 峰会上的演讲分享,将着重分享Flink在字节跳动数据流的实践. 字节跳动数据流 ...

  4. 解决twrp中内部存储为0MB的情况

    本来打算给备用机红米4a刷个dotos的系统,结果忘记双清就刷了,然后进去系统也是直接黑屏,很神奇的是长按电源键能弹出dotos的关机选项.然后进去twrp准备双清在刷时,发现内部存储变成了0MB,然 ...

  5. 《剑指offer》面试题60. n个骰子的点数

    问题描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i ...

  6. LaTex 中圆圈序号及一些特殊字符的输入

    众所周知,LATEX 提供了 \textcircled 命令用以给字符加圈,但效果却不怎么好: 实际上,加圈并不是一个平凡的变换,它会涉及到圈内字符形状的微调,而这是几乎无法在 TEX 宏层面解决的. ...

  7. 【一个小实验】腾讯云的redis的主从结构的特性

    使用腾讯云上的redis,可以添加多个备机的分片,并且可以选择不同的账号来设定主从读写的策略. 现在设置两个账号:primary-主节点写,主节点读:secondary-主节点写,从节点读. 研究出了 ...

  8. 三张图秒懂Redis集群设计原理

    转载Redis Cluster原理 转载https://blog.csdn.net/yejingtao703/article/details/78484151 redis集群部署方式: 单机 主从 r ...

  9. 集合框架-工具类-Collections-其他方法将非同步集合转成同步集合的方法

    集合框架TXT  Collections-其他方法将非同步集合转成同步集合的方法

  10. 集合框架-Map集合练习-记录字母次数思路及代码

    1 package cn.itcast.p10.map.test; 2 3 import java.util.Iterator; 4 import java.util.Map; 5 import ja ...