/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
Kratos是一套輕量級Go微服務框架,包含大量微服務相關框架及工具,解決了gin在微服務場景下的一些適配和微服務本身的一係列生態!
Kratos是一款功能強大的輕量級GO微服務框架,為用戶提供了海量的微服務相關框架和工具,為微服務的開發構建工作提供了幫助。軟件能夠輕鬆解決gin在微服務場景下的一些適配和微服務本身的一係列生態,滿足用戶的各種微服務框架功能需求。
依賴注入
Wire 是一個靈活的依賴注入工具,通過自動生成代碼的方式在編譯期完成依賴注入。
在各個組件之間的依賴關係中,通常鼓勵顯式初始化,而不是全局變量傳遞。
所以通過 Wire 進行初始化代碼,可以很好地解決組件之間的耦合,以及提高代碼維護性。
安裝工具#
go get github.com/google/wire/cmd/wireCopy
工作原理#
Wire 具有兩個基本概念:Provider 和 Injector。
Provider 是一個普通的 Go Func ,這個方法也可以接收其它 Provider 的返回值,從而形成了依賴注入;
使用方式#
在 Kratos 中,主要分為 server、service、biz、data 服務模塊,會通過 Wire 進行模塊順序的初始化;
在每個模塊中,隻需要一個 ProviderSet 提供者集合,就可以在 wire 中進行依賴注入;
並且我們在每個組件提供入口即可,不需要其它依賴,例如:
然後通過 wire.go 中定義所有 ProviderSet 可以完成依賴注入配置。
初始化組件#
通過 wire 初始化組件,需要定義對應的 wire.go,以及 kratos application 用於啟動管理。
在項目的 main 目錄中,運行 go generate 進行生成編譯期依賴注入代碼:
go generate ./...
Errors
APIs 錯誤碼可以統一通過 proto 定義業務原因,然後通過 protoc-gen-go-errors 生成判定代碼。
在errors包中,錯誤信息通過 proto 定義,並且實現對應的 Error 接口,並且可以直接通過 middleware 轉換成 gRPC 錯誤碼。
安裝工具#
go get github.com/go-kratos/kratos/cmd/protoc-gen-go-errors@latestCopy
錯誤定義#
api/helloworld/errors/helloworld.proto
錯誤生成#
通過 proto 生成對應的代碼:
kratos proto client api/helloworld/errors/helloworld.protoCopy
生成的源碼,可以直接通過 errors.IsMissingName(err) 進行對應的錯誤判定:
使用方式#
Config
使用方式#
配置源可以指定多個,並且 config 會進行合並成 map[string]interface{},然後通過 Scan 或者 Value 獲取值內容;
Logging
接口實現#
為了方便業務自適配不同的 log 接入使用,Logger 隻包含了最簡單的 Print 接口。當業務需要在 Kratos 框架內部使用自定義的 logging middlerware 的時候,隻需要簡單實現 Print 方法即可
使用方式#
輸出日誌到stdout#
使用自帶的 StdLogger 可以創建標準輸出日誌對象. 通過 NewHelper 構造日誌模塊,Helper 生成的日誌模塊可以提供不同等級的日誌輸出。
輸出日誌到fluentd#
引入 fluent sdk
在kratos中引入logging middleware#
在 http.ServerOption 中引入 logging.Server(), 則 Kratos 會在每次收到 HTTP 請求的時候打印詳細請求信息
APIs:協議通信以 HTTP/gRPC 為基礎,通過 Protobuf 進行定義;
Errors:通過 Protobuf 的 Enum 作為錯誤碼定義,以及工具生成判定接口;
Metadata:在協議通信 HTTP/gRPC 中,通過 Middleware 規範化服務元信息傳遞;
Config:支持多數據源方式,進行配置合並鋪平,通過 Atomic 方式支持動態配置;
Logger:標準日誌接口,可方便集成三方 log 庫,並可通過 fluentd 收集日誌;
Metrics:統一指標接口,可以實現各種指標係統,默認集成 Prometheus;
Tracing:遵循 OpenTelemetry 規範定義,以實現微服務鏈路追蹤;
Encoding:支持 Accept 和 Content-Type 進行自動選擇內容編碼;
Transport:通用的 HTTP/gRPC 傳輸層,實現統一的 Middleware 插件支持;
Registry:實現統一注冊中心接口,可插件化對接各種注冊中心;
簡單:不過度設計,代碼平實簡單;
通用:通用業務開發所需要的基礎庫的功能;
高效:提高業務迭代的效率;
穩定:基礎庫可測試性高,覆蓋率高,有線上實踐安全可靠;
健壯:通過良好的基礎庫設計,減少錯用;
高性能:性能高,但不特定為了性能做 hack 優化,引入 unsafe ;
擴展性:良好的接口設計,來擴展實現,或者通過新增基礎庫目錄來擴展功能;
容錯性:為失敗設計,大量引入對 SRE 的理解,魯棒性高;
工具鏈:包含大量工具鏈,比如 cache 代碼生成,lint 工具等等;