Golang 微服務框架,kratos 與 hertz 對比

早年,如果使用 go 來做微服務,可選框架只有go-zerogo-microgo-kit等。但隨着 Golang 的發展,社區也湧現出了一些新型的微服務框架,國內公司也開源了不少微服務框架,本文就主要介紹下嗶哩嗶哩的kratos與字節跳動的hertz

hertz 與 kratos 介紹

hertz

簡介

Hertz[həːts] 是一個 Golang 微服務 HTTP 框架,在設計之初參考了其他開源框架 fasthttpginecho 的優勢, 並結合字節跳動內部的需求,使其具有高易用性、高性能、高擴展性等特點,目前在字節跳動內部已廣泛使用。如今越來越多的微服務選擇使用 Golang,如果對微服務性能有要求,又希望框架能夠充分滿足內部的可定製化需求,Hertz 會是一個不錯的選擇。

架構設計

框架特點

在開發過程中,快速寫出來正確的代碼往往是更重要的。因此,在 Hertz 在迭代過程中,積極聽取用戶意見,持續打磨框架,希望爲用戶提供一個更好的使用體驗,幫助用戶更快的寫出正確的代碼。

Hertz 默認使用自研的高性能網絡庫 Netpoll,在一些特殊場景相較於 go net,Hertz 在 QPS、時延上均具有一定優勢。關於性能數據,可參考下圖 Echo 數據。

四個框架的對比:

Performance

三個框架的對比:

從 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)由凡人成爲戰神並展開弒神屠殺的冒險經歷。

架構設計

特性

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

cs0G7a

使用總結

kratos

QPenIH

使用總結

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;
}

總結

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/NF5yeBTFXsp8gEfXrRfmgA