微服務從代碼到k8s部署應有盡有系列(六、訂單服務)
我們用一個系列來講解從需求到上線、從代碼到k8s部署、從日誌到監控等各個方面的微服務完整實踐。
整個項目使用了go-zero開發的微服務,基本包含了go-zero以及相關go-zero作者開發的一些中間件,所用到的技術棧基本是go-zero項目組的自研組件,基本是go-zero全家桶了。
實戰項目地址://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、結尾
下了訂單,當然我們要支付了,那就看下一篇支付服務吧
項目地址
//github.com/zeromicro/go-zero
歡迎使用 go-zero
並 star 支持我們!
微信交流群
關注『微服務實踐』公眾號並點擊 交流群 獲取社區群二維碼。