这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

前言

GoHTTPHertz
Hertzhttp

基础使用

安装Hertz

HertzGoGo>=1.15
Hertz
go install github.com/cloudwego/hertz/cmd/hz@latest

安装后进行验证,输入以下命令:

hz -v

如果能正确输出版本信息,如下,就说明已经安装好了。

hz version v0.5.2

生成示例代码

hz
hertzhz newhz new -module examplego mod tidy

生成代码目录如下:

main.go
Server
go run main.go

运行命令,成功启动后,输出以下信息:

8888
http://127.0.0.1:8888/ping
json
{"message":"pong"}

Hertz路由

Hertz

静态路由

HertzGETPOSTPUTDELETEANY

路由组

Hertz

参数路由

Hertz:name
/hertz/:version
路径是否匹配
/hertz/v1匹配
/hertz/v2匹配
/hertz/v1/detail不匹配
/hertz/不匹配
RequestContext.Param
h.GET("/hertz/:version", func(ctx context.Context, c *app.RequestContext) {
    version := c.Param("version")
    c.String(consts.StatusOK, "Hello %s", version)
})

通配路由

Hertz*path
/hertz/*path
路径是否匹配
/hertz/v1匹配
/hertz/v1/detail匹配
/hertz/匹配
RequestContext.Param
h.GET("/hertz/:version/*action", func(ctx context.Context, c *app.RequestContext) {
    version := c.Param("version")
    action := c.Param("action")
    message := version + " is " + action
    c.String(consts.StatusOK, message)
})

参数绑定

HertzBindValidateBindAndValidate
httpHertztag
urlhertz:param*parambodyqueryheaderjson
BindAndValidate

Hertz Client

HertzHttp ClientHttp
GETHttp
func Get() {
    c, err := client.NewClient()
    if err != nil {
        return
    }
    status, body, _ := c.Get(context.Background(), nil, "http://www.example.com")
    fmt.Printf("status=%v body=%v\n", status, string(body))
}

POSTHttp
func Post() {
    c, err := client.NewClient()
    if err != nil {
        return
    }

    var postArgs protocol.Args
    postArgs.Set("arg", "a") // 发送参数
    status, body, _ := c.Post(context.Background(), nil, "http://www.example.com", &postArgs)
    fmt.Printf("status=%v body=%v\n", status, string(body))
}

代码生成

HertzHzhzHertzhzthriftprotobufIDLHertz
IDLhello.thrift
namespace go hello.example

struct HelloReq {
    // 添加 api 注解为方便进行参数绑定
    1: string Name (api.query="name"); 
}
struct HelloResp {
    1: string RespBody;
}

service HelloService {
    HelloResp HelloMethod(1: HelloReq request) (api.get="/hello");
}

执行命令生成代码,并整理依赖:

hz new -idl hello.thrift
go mod tidy

生成的文件结构如下:

Hertz性能

HertzWeb
NetpollJsonSonicSonicJsonsync.Pool

Hertz生态

Hertz
Http2opentelemetryJWTWebsocket

引用

字节内部视频——Go框架三件套详解(Web/RPC/ORM)