Golang 微服務框架,kratos 與 hertz 對比
早年,如果使用 go 來做微服務,可選框架只有
go-zero
、go-micro
、go-kit
等。但隨着 Golang 的發展,社區也湧現出了一些新型的微服務框架,國內公司也開源了不少微服務框架,本文就主要介紹下嗶哩嗶哩的kratos
與字節跳動的hertz
。
hertz 與 kratos 介紹
hertz
簡介
Hertz
[həːts] 是一個 Golang 微服務 HTTP 框架,在設計之初參考了其他開源框架 fasthttp
、gin
、echo
的優勢, 並結合字節跳動內部的需求,使其具有高易用性、高性能、高擴展性等特點,目前在字節跳動內部已廣泛使用。如今越來越多的微服務選擇使用 Golang,如果對微服務性能有要求,又希望框架能夠充分滿足內部的可定製化需求,Hertz 會是一個不錯的選擇。
架構設計
框架特點
- 高易用性
在開發過程中,快速寫出來正確的代碼往往是更重要的。因此,在 Hertz 在迭代過程中,積極聽取用戶意見,持續打磨框架,希望爲用戶提供一個更好的使用體驗,幫助用戶更快的寫出正確的代碼。
- 高性能
Hertz 默認使用自研的高性能網絡庫 Netpoll,在一些特殊場景相較於 go net,Hertz 在 QPS、時延上均具有一定優勢。關於性能數據,可參考下圖 Echo 數據。
四個框架的對比:
三個框架的對比:
從 hertz 官方壓測數據看,Gin 完全打不過 hertz 啊喂。Gin 已經算是 go http 框架裏面性能佼佼者了。
關於詳細的性能數據,可參考 https://github.com/cloudwego/hertz-benchmark。
- 高擴展性
Hertz 採用了分層設計,提供了較多的接口以及默認的擴展實現,用戶也可以自行擴展。同時得益於框架的分層設計,框架的擴展性也會大很多。目前僅將穩定的能力開源給社區,更多的規劃參考 RoadMap。
- 多協議支持
Hertz 框架原生提供 HTTP1.1、ALPN 協議支持。除此之外,由於分層設計,Hertz 甚至支持自定義構建協議解析邏輯,以滿足協議層擴展的任意需求。
- 網絡層切換能力
Hertz 實現了 Netpoll 和 Golang 原生網絡庫 間按需切換能力,用戶可以針對不同的場景選擇合適的網絡庫,同時也支持以插件的方式爲 Hertz 擴展網絡庫實現。
kratos
簡介
Kratos
一套輕量級 Go 微服務框架,包含大量微服務相關框架及工具。
名字來源於:《戰神》遊戲以希臘神話爲背景,講述奎託斯(Kratos)由凡人成爲戰神並展開弒神屠殺的冒險經歷。
架構設計
特性
-
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:實現統一註冊中心接口,可插件化對接各種註冊中心;
kratos-layout 方案
kratos 官方提供了一套目錄結構方案
.
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── api // 下面維護了微服務使用的proto文件以及根據它們所生成的go文件
│ └── helloworld
│ └── v1
│ ├── error_reason.pb.go
│ ├── error_reason.proto
│ ├── error_reason.swagger.json
│ ├── greeter.pb.go
│ ├── greeter.proto
│ ├── greeter.swagger.json
│ ├── greeter_grpc.pb.go
│ └── greeter_http.pb.go
├── cmd // 整個項目啓動的入口文件
│ └── server
│ ├── main.go
│ ├── wire.go // 我們使用wire來維護依賴注入
│ └── wire_gen.go
├── configs // 這裏通常維護一些本地調試用的樣例配置文件
│ └── config.yaml
├── generate.go
├── go.mod
├── go.sum
├── internal // 該服務所有不對外暴露的代碼,通常的業務邏輯都在這下面,使用internal避免錯誤引用
│ ├── biz // 業務邏輯的組裝層,類似 DDD 的 domain 層,data 類似 DDD 的 repo,而 repo 接口在這裏定義,使用依賴倒置的原則。
│ │ ├── README.md
│ │ ├── biz.go
│ │ └── greeter.go
│ ├── conf // 內部使用的config的結構定義,使用proto格式生成
│ │ ├── conf.pb.go
│ │ └── conf.proto
│ ├── data // 業務數據訪問,包含 cache、db 等封裝,實現了 biz 的 repo 接口。我們可能會把 data 與 dao 混淆在一起,data 偏重業務的含義,它所要做的是將領域對象重新拿出來,我們去掉了 DDD 的 infra層。
│ │ ├── README.md
│ │ ├── data.go
│ │ └── greeter.go
│ ├── server // http和grpc實例的創建和配置
│ │ ├── grpc.go
│ │ ├── http.go
│ │ └── server.go
│ └── service // 實現了 api 定義的服務層,類似 DDD 的 application 層,處理 DTO 到 biz 領域實體的轉換(DTO -> DO),同時協同各類 biz 交互,但是不應處理複雜邏輯
│ ├── README.md
│ ├── greeter.go
│ └── service.go
└── third_party // api 依賴的第三方proto
├── README.md
├── google
│ └── api
│ ├── annotations.proto
│ ├── http.proto
│ └── httpbody.proto
└── validate
├── README.md
└── validate.proto
hertz 與 kratos 比較
hertz
使用總結
-
該框架可輕可重,你可以把 hertz 當成一個類似 Gin 的簡單 http 框架,也可以構建爲一個功能豐富的微服務框架。
-
如果你需要使用一些擴展服務特性,學習成本是比 kratos 高的。同時編碼自由度也會降低,你必須學習它,按它的規範來寫代碼。
-
可以基於 thrift 和 protobuf 的 IDL 生成 Hertz 項目的腳手架,感興趣的可以試試
kratos
使用總結
-
上手較快,官方提供的文檔與示例代碼比較豐富,而且還提供了一套項目結構模板 kratos-layout
-
編程與工程化思想可以學習
-
Kratos 僅支持使用 Protobuf 進行 API 定義。從其它框架遷移過來可能比較困難 比如定義一個路由爲
/helloworld/{name}
,請求method
爲GET
的接口需要定義如下proto
結構
syntax = "proto3";
package helloworld.v1;
import "google/api/annotations.proto";
option go_package = "github.com/go-kratos/kratos-layout/api/helloworld/v1;v1";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/helloworld/{name}"
};
}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
總結
-
兩個框架各有特色,很多地方都值得我們去學習瞭解。
-
Hertz
最主要的特性其實就是它的性能與穩定性,比較直觀的就是抖音每日的海量請求。 -
總體來說
Hertz
的學習成本是高於kratos
的,這是由社區活躍性與框架決定的。 -
kratos
提供了一個kratos-layout
,可以幫助用戶規範一個合理的項目結構。 -
由於
Hertz
開源時間相對較短,所以用戶比較少,官方支持也沒有kratos
活躍,導致能找到的學習使用資料也比較少。 -
兩者的微服務支持大同小異,具體請詳細閱讀官方文檔。
-
建議大家都真實上手使用一下這兩款框架,只有深入使用才能瞭解到它們的設計理念與精髓。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/NF5yeBTFXsp8gEfXrRfmgA