微服務(wù)從代碼到k8s部署應(yīng)有盡有系列(六、訂單服務(wù))
我們用一個(gè)系列來(lái)講解從需求到上線、從代碼到k8s部署、從日志到監(jiān)控等各個(gè)方面的微服務(wù)完整實(shí)踐。
整個(gè)項(xiàng)目使用了go-zero開發(fā)的微服務(wù),基本包含了go-zero以及相關(guān)go-zero作者開發(fā)的一些中間件,所用到的技術(shù)棧基本是go-zero項(xiàng)目組的自研組件,基本是go-zero全家桶了。
實(shí)戰(zhàn)項(xiàng)目地址:https://github.com/Mikaelemmmm/go-zero-looklook
1、訂單服務(wù)業(yè)務(wù)架構(gòu)圖

2、依賴關(guān)系
order-api(訂單api)
order-rpc(訂單rpc) payment-rpc(支付rpc)
payment-rpc(支付rpc)
mqueue-rpc(消息隊(duì)列)
order-rpc(訂單rpc)
mqueue-rpc(消息隊(duì)列) travel-rpc(民宿r(nóng)pc)
3、訂單舉例
3.1 下訂單
1、用戶在去瀏覽travel服務(wù)中的民宿homestay看中選擇日期之后要下單,調(diào)用下單api接口
app/order/cmd/api/desc/order.api
// 訂單模塊v1版本的接口
@server(
prefix: order/v1
group: homestayOrder
)
service order {
@doc "創(chuàng)建民宿訂單"
@handler createHomestayOrder
post /homestayOrder/createHomestayOrder (CreateHomestayOrderReq) returns (CreateHomestayOrderResp)
.....
}
2、order-api中調(diào)用order-rpc

3、rpc中校驗(yàn)條件創(chuàng)建訂單之后 ,會(huì)調(diào)用mqueue-rpc創(chuàng)建一個(gè)延遲關(guān)閉訂單的消息隊(duì)列

4、mqueue-rpc 延遲隊(duì)列
延遲隊(duì)列是用的asynq,asynq是基于redis的高性能隊(duì)列,同時(shí)支持消息隊(duì)列、定時(shí)隊(duì)列、固定周期隊(duì)列,但是我們這個(gè)項(xiàng)目為了演示go-zero官方的消息隊(duì)列g(shù)o-queue(go-queue是基于kafka的),所以消息隊(duì)列用的go-queue,延遲隊(duì)列、定時(shí)任務(wù)用asynq。這里注意,這里只是往延遲隊(duì)列添加延遲任務(wù),具體執(zhí)行不在這里,那我們?nèi)タ纯?0分鐘之后具體執(zhí)行的代碼,在app/order/cmd/mq

5、延遲20分鐘執(zhí)行的任務(wù)隊(duì)列
在app/order/cmd/mq,這里我要說(shuō)明一下,go-zero官方goctl支持生成的服務(wù)目前是api、rpc,目前暫時(shí)還沒(méi)有支持console、mq等,但是go-zero提供了ServiceGroup,方便我們管理我們自己任何的服務(wù),所以在mq中我是用了ServiceGroup管理了服務(wù),這也是官方推薦的使用方式,代碼如下:
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進(jìn)去,但是如何成為一個(gè)service呢?那你就要實(shí)現(xiàn)兩個(gè)方法一個(gè)Starter、一個(gè)Stoper

2)我們?cè)趍ain中可以看到循環(huán)listen.Mqs(c) ?,那我們看看listen.Mqs(c) 都有哪些

我們不止要監(jiān)聽asynq的延遲隊(duì)列、定時(shí)隊(duì)列,后面我們還想監(jiān)聽go-queue的kafka消息隊(duì)列,在代碼上我們考慮不想把go-queue的kafka消息隊(duì)列跟asynq的延遲隊(duì)列、定時(shí)隊(duì)列放到一起去,所以這里做了個(gè)分類
3)asyny的延遲消息隊(duì)列
定義asynq

定義路由

具體實(shí)現(xiàn)邏輯(關(guān)閉訂單邏輯)

所以我們啟動(dòng)這個(gè)order-mq的時(shí)候,asynq就會(huì)被加載、定義路由,當(dāng)我們之前添加的延遲隊(duì)列到了20分鐘,就會(huì)自動(dòng)執(zhí)行關(guān)閉訂單邏輯,如果訂單沒(méi)有被支付,這里就會(huì)關(guān)閉掉訂單,支付了就忽略掉了,這樣就可以不用使用定時(shí)任務(wù)輪訓(xùn)關(guān)閉訂單了,哈哈
3.2 訂單列表
沒(méi)啥邏輯,就是查出來(lái)顯示罷了,自己看一下就好了
// 訂單模塊v1版本的接口
@server(
prefix: order/v1
group: homestayOrder
)
service order {
@doc "用戶訂單列表"
@handler userHomestayOrderList
post /homestayOrder/userHomestayOrderList (UserHomestayOrderListReq) returns (UserHomestayOrderListResp)
}
3.3 訂單明細(xì)
沒(méi)啥邏輯,就是查出來(lái)顯示罷了,自己看一下就好了
// 訂單模塊v1版本的接口
@server(
prefix: order/v1
group: homestayOrder
)
service order {
@doc "用戶訂單明細(xì)"
@handler userHomestayOrderDetail
post /homestayOrder/userHomestayOrderDetail (UserHomestayOrderDetailReq) returns (UserHomestayOrderDetailResp)
}
4、結(jié)尾
下了訂單,當(dāng)然我們要支付了,那就看下一篇支付服務(wù)吧
項(xiàng)目地址
https://github.com/zeromicro/go-zero
歡迎使用 go-zero 并 star 支持我們!
推薦閱讀
