記錄下學習使用kratos的過程一

wunderbar發表於2022-05-30

學習源

步驟及總結

新建微服務模組、版本模組:

kratos new user
kratos proto add api/user/v1/user.proto

編寫proto檔案,記錄下簡單的使用,詳情見官網

  • message 定義結構體,其中的欄位表示結構體的欄位
  • 先定義遠端方法中的接收結構體以及響應結構體
  • 再使用service 定義微服務介面,以及待實現的遠端方法

輸出微服務的go檔案

make api
  • grpc.go中是定義了客戶端的,可以把這個proto檔案發到任意客戶端,用protoc生成指定的語言,比如帶上引數 –cpp_out生成cpp檔案,可以明確知道這個微服務定義了哪些方法
  • protoc的具體命令在Makefile中
  • PS:輸出proto檔案中的rpc部分,需要帶上引數參考
    protoc --go_out=plugins=grpc:. *.proto

修改service/user/internal/conf/conf.proto,欄位需與configs下面的配置保持一致

  • 為什麼是configs?這是main.go在呼叫的時候傳的引數(寫在init()中的)
  • 先看下conf.proto,一個Bootstrap結構體中包含了兩個欄位,一個server,一個data,分別對應上層目錄中相鄰的模組目錄,data模組主要是負責資料庫的建立,以及資料表模型的CRUD;server則是決定rpc的連線方式。先這樣,生成下config的go檔案
    make config
  • 然後更改下configs中的配置

現在該寫下data層了

  • data.go負責資料庫連線生成
  • user.go中定義資料表結構體,主要負責資料庫層面的CRUD。定義欄位型別時,要注意與user.proto生成中的型別是否一致,如果不一致的話,需要在返回型別中轉換成user.proto中定義的型別,比如birthday欄位

再看看biz層

  • 這一層是業務邏輯層
  • 根據data層返回的資料,進行業務整理
  • 可以看出biz是依賴於data的

再看看server層

  • grpc.go中定義了一個生成grpc服務的方法,關鍵引數是UserService,這指定了這次微服務的 主角

那就看看service層,UserService

  • 這個介面是要實現由user.proto生成的v1.UserServer介面
  • 需要繼承v1.UnimplementedUserServer,這是一個針對客戶端調取不存在的遠端方法的錯誤處理
  • 也是因為go是鴨子語言,在編寫UserService時,對實現介面的方法不敏感,可能寫的方法名與v1.UserServer介面定義的不一致;當然它的好處是,不妨礙呼叫已實現的方法
  • 這個UserService是依賴於biz層的,主要是負責通過biz層處理結果整理相應遠端函式的返回資料格式

那麼這些層是怎麼串起來的呢

  • 先整理下依賴關係

server->service->biz->data

  • 當然可以手動生成各部分依賴,不過有更簡單地方式:wire

  • 在各層中,server.go、service.go、biz.go、data.go中都將各自的邏輯放到了provider中

    var  ProviderSet = wire.NewSet(NewUserUsecase)
  • 可以在cmd/user中看到wire.go(這個檔案是不經過IDE校驗的——無法ctl+滑鼠點選到相應方法,這是由於前兩行),通過在該資料夾下執行 wire 命令,可以自動生成wire_gen.go

  • 在wire.go中,wire.build引數不僅有上面的各個ProviderSet,還有一個main.go中的函式newApp(),然後發起了一次依賴的自行例項化,返回一個kratos.App指標

  • 入口檔案main.go中就是獲取配置,使kratos.App跑起來

    kratos run

測試相關

gingo 文件

  • 先在需要測試的目錄中,編寫*_suit_test.go,比如:data層目錄;在BeforeSuite方法中連線資料庫,在AfterSuite可以列印一些結束標誌吧;然後再user_test.go中編寫user.go的相關測試用例

  • 使用gomock,需要對指定介面生成mock檔案,參考;這裡需要注意下“user/internal/biz”,這個需要寫完整,而不能寫 .

    mockgen -destination=../mock/mrepo/user.go -package=mrepo "user/internal/biz" UserRepo
  • 為了方便,可以在UserRepo介面上新增這句,方法有變動,方便重新生成

    //go:generate mockgen -destination=../mock/mrepo/user.go -package=mrepo "user/internal/biz" UserRepo

使用kratos封裝的consul的一些坑, 官方示例

shop/configs/config.yaml ;寫成 “discovery:///shop.user.service” , 會報 “endpoint found,refused to write” ;還是得改成”127.0.0.1:50052”,才能呼叫。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
享受追蹤思維漏洞的過程

相關文章