我們用一個系列來講解從需求到上線、從程式碼到k8s部署、從日誌到監控等各個方面的微服務完整實踐。
整個專案使用了go-zero開發的微服務,基本包含了go-zero以及相關go-zero作者開發的一些中介軟體,所用到的技術棧基本是go-zero專案組的自研元件,基本是go-zero全家桶了。
實戰專案地址:github.com/Mikaelemmmm/go-zero-loo...
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、結尾
下了訂單,當然我們要支付了,那就看下一篇支付服務吧
專案地址
歡迎使用 go-zero
並 star 支援我們!
微信交流群
關注『微服務實踐』公眾號並點選 交流群 獲取社群群二維碼。
本作品採用《CC 協議》,轉載必須註明作者和本文連結