咱们用一个系列来解说从需要到上线、从代码到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-zero
并 star 反对咱们!
微信交换群
关注『微服务实际』公众号并点击 交换群 获取社区群二维码。
发表回复