字節(jié)跳動(dòng) Golang 微服務(wù) HTTP 框架 Hertz
最近在研究字節(jié)、嗶哩嗶哩等開源技術(shù)的Golang框架,發(fā)現(xiàn)字節(jié)開源的Golang 微服務(wù) HTTP 框架Hertz,用起來相對(duì)舒服很多。
為什么選擇 Hertz
Hertz[h??ts] 是一個(gè) Golang 微服務(wù) HTTP 框架,在設(shè)計(jì)之初參考了其他開源框架 fasthttp、gin、echo 的優(yōu)勢(shì), 并結(jié)合字節(jié)跳動(dòng)內(nèi)部的需求,使其具有高易用性、高性能、高擴(kuò)展性等特點(diǎn),目前在字節(jié)跳動(dòng)內(nèi)部已廣泛使用。
如今越來越多的微服務(wù)選擇使用 Golang,如果對(duì)微服務(wù)性能有要求,又希望框架能夠充分滿足內(nèi)部的可定制化需求,Hertz 會(huì)是一個(gè)不錯(cuò)的選擇。
架構(gòu)設(shè)計(jì)
同時(shí),也對(duì)Hertz做了高性能方面的對(duì)比
Hertz 默認(rèn)使用自研的高性能網(wǎng)絡(luò)庫 Netpoll,在一些特殊場(chǎng)景相較于 go net,Hertz 在 QPS、時(shí)延上均具有一定優(yōu)勢(shì)。關(guān)于性能數(shù)據(jù),可參考下圖 Echo 數(shù)據(jù)。
四個(gè)框架的對(duì)比
三個(gè)框架的對(duì)比:
框架特點(diǎn)
高易用性
在開發(fā)過程中,快速寫出來正確的代碼往往是更重要的。因此,在 Hertz 在迭代過程中,積極聽取用戶意見,持續(xù)打磨框架,希望為用戶提供一個(gè)更好的使用體驗(yàn),幫助用戶更快的寫出正確的代碼。
高性能
Hertz 默認(rèn)使用自研的高性能網(wǎng)絡(luò)庫 Netpoll,在一些特殊場(chǎng)景相較于 go net,Hertz 在 QPS、時(shí)延上均具有一定優(yōu)勢(shì)。關(guān)于性能數(shù)據(jù),可參考下圖 Echo 數(shù)據(jù)。
高擴(kuò)展性
Hertz 采用了分層設(shè)計(jì),提供了較多的接口以及默認(rèn)的擴(kuò)展實(shí)現(xiàn),用戶也可以自行擴(kuò)展。同時(shí)得益于框架的分層設(shè)計(jì),框架的擴(kuò)展性也會(huì)大很多。
多協(xié)議支持
Hertz 框架原生提供 HTTP1.1、ALPN 協(xié)議支持。除此之外,由于分層設(shè)計(jì),Hertz 甚至支持自定義構(gòu)建協(xié)議解析邏輯,以滿足協(xié)議層擴(kuò)展的任意需求。
網(wǎng)絡(luò)層切換能力
Hertz 實(shí)現(xiàn)了 Netpoll 和 Golang 原生網(wǎng)絡(luò)庫 間按需切換能力,用戶可以針對(duì)不同的場(chǎng)景選擇合適的網(wǎng)絡(luò)庫,同時(shí)也支持以插件的方式為 Hertz 擴(kuò)展網(wǎng)絡(luò)庫實(shí)現(xiàn)。
Hertz
官網(wǎng)地址:https://www.cloudwego.io/zh/docs/hertz/
圖片
官方介紹:
Hertz [h??ts] 是一個(gè) Golang 微服務(wù) HTTP 框架,具有高易用性、高性能、高擴(kuò)展性等特點(diǎn)。
demo演示
- 準(zhǔn)備 Golang 開發(fā)環(huán)境
 - 如果您之前未搭建 Golang 開發(fā)環(huán)境,可以參考 Golang 安裝。推薦使用最新版本的 Golang,或保證現(xiàn)有 Golang 版本 >= 1.16。小于 1.16 版本,可以自行嘗試使用但不保障兼容性和穩(wěn)定性。
 - 確保打開 go mod 支持 (Golang >= 1.15 時(shí),默認(rèn)開啟)。
 - 完成安裝后,你可能需要設(shè)置一下國內(nèi)代理:go env -w GOPROXY=https://goproxy.cn。
 
目前,Hertz 支持 Linux、macOS、Windows 系統(tǒng)。
快速開發(fā)實(shí)踐
在完成環(huán)境準(zhǔn)備后,可以按照如下操作快速啟動(dòng) Hertz Server:
- 在當(dāng)前目錄下創(chuàng)建 hertz_demo 文件夾,進(jìn)入該目錄中。
 - 創(chuàng)建 main.go 文件。
 - 在 main.go 文件中添加以下代碼。
 
package main
import (
 "context"
 "github.com/cloudwego/hertz/pkg/app"
 "github.com/cloudwego/hertz/pkg/app/server"
 "github.com/cloudwego/hertz/pkg/common/utils"
 "github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
 h := server.Default()
 h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
  c.JSON(consts.StatusOK, utils.H{"message": "pong"})
 })
 h.Spin()
}
圖片
- 生成 go.mod 文件。
 
go mod init hertz_demo- 整理 & 拉取依賴。
 
go mod tidy- 運(yùn)行示例代碼。
 
go run hertz_demo如果成功啟動(dòng),你將看到以下信息:
PS D:\wx_vagrant\www\cloudwego\hertz\hertz_demo> go run hertz_demo
2024/11/07 10:01:48.832771 engine.go:669: [Debug] HERTZ: Method=GET    absolutePath=/ping                     --> handlerName=main.main.func1 (num=2 handlers)
2024/11/07 10:01:48.849373 engine.go:397: [Info] HERTZ: Using network library=standard
2024/11/07 10:01:48.852301 transport.go:65: [Info] HERTZ: HTTP server listening on address=[::]:8888接下來,我們可以對(duì)接口進(jìn)行測(cè)試:
curl http://127.0.0.1:8888/ping如果不出意外,我們可以看到類似如下輸出:
{"message":"pong"}
圖片
參考鏈接:https://www.cloudwego.io/zh/docs/hertz















 
 
 














 
 
 
 