微服務從代碼到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-zerostar 支持我們!

微信交流群

關注『微服務實踐』公眾號並點擊 交流群 獲取社區群二維碼。