青训营笔记hertz初体验|豆包MarsCode AI刷题

63 阅读4分钟

一,引言

在现代分布式系统中,快速、高效的通信框架是开发高性能后端服务的关键。字节跳动开源的 Hertz 框架以其轻量级、高性能、以及丰富的功能扩展受到开发者的广泛关注。作为基于 Golang 的 HTTP 框架,Hertz 提供了强大的 HTTP 服务构建能力,同时支持现代化 Web 技术,如 HTTP/2、JWT 鉴权、WebSocket 等

一,hertz框架使用

快速上手

在完成环境准备后,可以按照如下操作快速启动 Hertz Server:

  1. 在当前目录下创建 hertz_demo 文件夹,进入该目录中。

  2. 创建 main.go 文件。

  3. 在 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()
    }
    
  4. 生成 go.mod 文件。

    go mod init hertz_demo
    
  5. 整理 & 拉取依赖。

    go mod tidy
    
  6. 运行示例代码。

    go run hertz_demo
    

    如果成功启动,你将看到以下信息:

    2022/05/17 21:47:09.626332 engine.go:567: [Debug] HERTZ: Method=GET    absolutePath=/ping   --> handlerName=main.main.func1 (num=2 handlers)
    2022/05/17 21:47:09.629874 transport.go:84: [Info] HERTZ: HTTP server listening on address=[::]:8888
    

    接下来,我们可以对接口进行测试:

    curl http://127.0.0.1:8888/ping
    

    如果不出意外,我们可以看到类似如下输出:

    {"message":"pong"}
    

二, 使用 hz 工具生成代码后,可以直接调用,减少了大量重复代码的编写。

通过 hz 工具基于 IDL 快速生成接口代码

Hertz 提供了 hz 代码生成工具,开发者可以通过编写接口定义文件(如 Protobuf 或 Thrift),生成对应的服务端和客户端代码。

hz 是 Hertz 框架提供的一个用于生成代码的命令行工具,可以用于生成 Hertz 项目的脚手架。

安装命令行工具

首先,我们需要安装使用本示例所需要的命令行工具 hz:

  1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将 $GOPATH/bin 添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录。
  2. 安装 hz:go install github.com/cloudwego/hertz/cmd/hz@latest

生成/编写示例代码

  1. 在当前目录下创建 hertz_demo 文件夹,进入该目录中。
  2. 生成代码
  • 直接使用 hz new,若当前不在 GOPATH,需要添加 -module 或者 -mod flag 指定一个自定义的模块名称。详细参考这里

  • 通过指定已经定义好的 idl 文件进行代码生成,例如 hz new -idl hello.thrift

    namespace go hello.world
    
    service HelloService {
        string Hello(1: string name) (api.get="/hello");
    }
    

    执行完毕后, 会在当前目录下生成 Hertz 项目的脚手架, 自带一个 ping 接口用于测试。

  1. 整理 & 拉取依赖。

    go mod init # 当前目录不在 GOPATH 下不需要 `go mod init` 这一步
    go mod tidy
    

运行示例代码

完成以上操作后,我们可以直接编译并启动 Server。

go build -o hertz_demo && ./hertz_demo

如果成功启动,你将看到以下信息:

2022/05/17 21:47:09.626332 engine.go:567: [Debug] HERTZ: Method=GET    absolutePath=/ping   --> handlerName=main.main.func1 (num=2 handlers)
2022/05/17 21:47:09.629874 transport.go:84: [Info] HERTZ: HTTP server listening on address=[::]:8888

接下来,我们可以对接口进行测试:

curl http://127.0.0.1:8888/ping

如果不出意外,我们可以看到类似如下输出:

{"message":"pong"}

到现在,我们已经成功启动了 Hertz Server,并完成了一次调用。

更新项目代码

如果需要对项目进行进一步的更新, 应使用 hz update 命令, 这里以添加一个 Bye 方法为例。

namespace go hello.world

service HelloService {
    string Hello(1: string name) (api.get="/hello");
    string Bye(1: string name) (api.get="/bye");
}

此时在项目根目录执行 hz update 更新项目。

hz update -idl hello.thrift

更多 hz 使用方法可参考: hz

收获:Hertz 的优势在于开发效率与性能

通过青训营期间的实践,我深刻体会到 Hertz 的核心优势:

  • 高效的数据传输
    Hertz 在 HTTP/2 的加持下,通过二进制编码进行数据传输。与文本编码相比,二进制数据占用的带宽更小,解析速度更快,适合需要高吞吐量的服务场景。

  • 支持反向代理功能
    Hertz 的反向代理功能使其不仅可以用于服务端构建,还可作为 API 网关来分发流量,实现负载均衡和后端服务隔离。

  • OpenTelemetry 集成
    Hertz 提供了 OpenTelemetry 的扩展,用于分布式追踪和性能监控。通过该扩展,开发者能够直观了解服务调用链路,快速定位性能瓶颈。

  • 安全与实时通信支持
    Hertz 支持 JWT 鉴权,用于保护服务安全。此外,WebSocket 的支持使得实时通信变得更加方便,为构建聊天应用、通知推送等功能提供了基础设施。

    内容引自:快速开始 | CloudWeGo