Kratos提供非常多的服務框架,可以幫助用戶在搭建網站和應用的時候快速配置通訊,配置HTTP服務,配置數據分發服務,軟件提供的微服務內容還是很多的,可以在軟件使用api框架組件快速設計項目,直接調用api功能就可以提升設計效率,輕松部署相關的功能模塊,支持錯誤組件功能,通信錯誤消息處理方案可以使用該組件配置,支持志功能,系統的志分析功能可以直接通過Logger組件配置,支持Registry組件,可以為你的系統配置各種平臺的注冊接口,方便通過第三方賬戶注冊軟件!
Kratos軟件功能
Kratos 一套輕量級 Go 微服務框架,包含大量微服務相關框架及工具。
APIs:協議通信以 HTTP/gRPC 為基,通過 Ptobuf 進行定義;
Errs:通過 Ptobuf 的 Enum 作為錯誤碼定義,以及工具生成判定接口;
Metadata:在協議通信 HTTP/gRPC 中,通過 Middleware 規范化服務元傳遞;
Config:支持多數據源方式,進行配置合并鋪平,通過 Atomic 方式支持動態配置;
Logger:標準志接口,可方便集成三方 log 庫,并可通過 fluentd 收集志;
Metcs:統一指標接口,可以實現各種指標系統,默認集成 Pmetheus;
Tracing:遵循 OpenTelemetry 規范定義,以實現微服務鏈路追蹤;
Encoding:支持 Accept 和 Content-Type 進行自動選擇內容編碼;
Transport:通用的 HTTP/gRPC 傳輸層,實現統一的 Middleware 插件支持;
Registry:實現統一注冊中心接口,可插件化對接各種注冊中心;
Kratos軟件特色
簡單:不過度設計,代碼平實簡單;
通用:通用業務開發所需要的基庫的功能;
高效:提高業務迭代的效率;
穩定:基庫可測試高,覆蓋率高,有線上實踐安全可;
健壯:通過良好的基庫設計,減少錯用;
高能:能高,但不特定為了能做 hack 優化,引入 unsafe ;
擴展:良好的接口設計,來擴展實現,或者通過新增基庫目錄來擴展功能;
容錯:為失敗設計,大量引入對 SRE 的理解,魯棒高;
工具鏈:包含大量工具鏈,比如 cache 代碼生成,lint 工具等等;
Kratos教程
依賴注入
Wire 是一個靈活的依賴注入工具,通過自動生成代碼的方式在編譯期完成依賴注入。
在各個組件之間的依賴關系中,通常鼓勵顯式初始化,而不是全局變量傳遞。
所以通過 Wire 進行初始化代碼,可以很好地解決組件之間的耦合,以及提高代碼。
安裝工具#
go get github.com/google/wire/cmd/wireCopy
工作原理#
Wire 具有兩個基本概念:Pvider 和 Injector。
Pvider 是一個普通的 Go Func ,這個方法也可以接收其它 Pvider 的返回值,從而形成了依賴注入;
使用方式#
在 Kratos 中,主要分為 、、biz、data 服務模塊,會通過 Wire 進行模塊順序的初始化;
在每個模塊中,只需要一個 PviderSet 提供者,就可以在 wire 中進行依賴注入;
并且我們在每個組件提供入口即可,不需要其它依賴,例如:
通過 wire.go 中定義所有 PviderSet 可以完成依賴注入配置。
初始化組件#
通過 wire 初始化組件,需要定義對應的 wire.go,以及 kratos application 用于啟動管理。
在項目的 main 目錄中,運行 go generate 進行生成編譯期依賴注入代碼:
go generate ./…
Errs
APIs 錯誤碼可以統一通過 pto 定義業務原因,通過 ptoc-gen-go-errs 生成判定代碼。
在errs包中,錯誤通過 pto 定義,并且實現對應的 Err 接口,并且可以直接通過 middleware 轉換成 gRPC 錯誤碼。
安裝工具#
go get github.com/go-kratos/kratos/cmd/ptoc-gen-go-errs@latestCopy
錯誤定義#
api/helloworld/errs/helloworld.pto
錯誤生成#
通過 pto 生成對應的代碼:
kratos pto client api/helloworld/errs/helloworld.ptoCopy
生成的源碼,可以直接通過 errs.IsMissingName(err) 進行對應的錯誤判定:
使用方式#
Config
使用方式#
配置源可以指定多個,并且 config 會進行合并成 map[stng]intece{},通過 Scan 或者 Value 獲取值內容;
Logging
接口實現#
為了方便業務自適配不同的 log 接入使用,Logger 只包含了最簡單的 Pnt 接口。當業務需要在 Kratos 框架內部使用自定義的 logging middlerware 的時候,只需要簡單實現 Pnt 方法即可
使用方式#
輸出志到stdout#
使用自帶的 StdLogger 可以創建標準輸出志對象. 通過 NewHelper 構造志模塊,Helper 生成的志模塊可以提供不同等級的志輸出。
輸出志到fluentd#
引入 fluent sdk
在kratos中引入logging middleware#
在 http.ServerOption 中引入 logging.Server(), 則 Kratos 會在每次收到 HTTP 請求的時候打印詳細請求