初识 Hertz | 青训营

76 阅读3分钟

Kitex 与 Hertz

刚刚初步学习使用 Kitex,让我们方便地进行 RPC 调用,它要解决的是内部不同组件之间的协作,可以说“对内”。对内可以相对灵活,为了性能可以定制通信协议,HTTP不是必须的。那么有“对内”就有“对外”,对外也就是面对用户,需要提供标准的基于 Web 服务,需要实现路由、中间件、请求处理等功能,而这些相对标准化、流程化的工作可以由 HTTP 框架来帮助完成,它们能自动生成部分代码,隐藏部分调用细节,Hertz 就是这些框架中的一种。

所以我们要接着学习一种 HTTP 框架的使用,比如 Hertz,gin,fiber,echo 等都可以,选一种适合使用习惯的就好。

Hertz

Hertz[həːts] 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttpginecho 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。 如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。

接下来简单看看 Hertz 如何使用,首先想到的是在代码中直接引入其组建,然后执行命令 go mod tidy 下载各依赖;另一种是借助 Hertz 框架提供的一个用于生成代码的命令行工具 hz,它可以用于生成 Hertz 项目的脚手架。

安装 hz

go install github.com/cloudwego/hertz/cmd/hz@latest

新建项目

新建一个空文件夹,即放 demo 项目的地方,然后执行命令:

hz new -module hertz_demo

在文件夹中生成了一个简单框架的模板:

❯ tree
.
├── biz
│   ├── handler
│   │   └── ping.go
│   └── router
│       └── register.go
├── build.sh
├── go.mod
├── main.go
├── router.go
├── router_gen.go
└── script
    └── bootstrap.sh

5 directories, 8 files

通过观察 router.go,发现这是一个简单的 ping-pong 服务器的例子。

// Code generated by hertz generator.

package main

import (
	"github.com/cloudwego/hertz/pkg/app/server"
	handler "hertz_demo/biz/handler"
)

// customizeRegister registers customize routers.
func customizedRegister(r *server.Hertz) {
	r.GET("/ping", handler.Ping)

	// your code ...
}

执行命令下载依赖:

go mod tidy

编译运行

发现项目根目录中有 build.sh 可以直接执行来编译(实际是 go build 命令)

./build.sh

生成可执行文件 output/bin/hertz_service

❯ ./output/bin/hertz_service
2023/08/22 21:59:46.646731 engine.go:617: [Debug] HERTZ: Method=GET    absolutePath=/ping                     --> handlerName=hertz_demo/biz/handler.Ping (num=2 handlers)
2023/08/22 21:59:46.647022 engine.go:389: [Info] HERTZ: Using network library=netpoll
2023/08/22 21:59:46.647521 transport.go:115: [Info] HERTZ: HTTP server listening on address=[::]:8888

那么在浏览器中访问 http://127.0.0.1:8888/ping

{"message":"pong"}

Hertz 特性

Hertz 提供了一些常用的特性。

  • 路由注册:Hertz 提供了 GETPOSTPUTDELETEANY 等方法用于注册路由。

  • 路由组:Hertz 提供了路由组 ( Group ) 的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。

  • 丰富的路由类型:Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由 (命名参数、通配参数)。

    路由的优先级:静态路由 > 命名参数路由 > 通配参数路由

  • 功能丰富的客户端。

  • 网络库:Hertz 默认集成了 Netpoll 和 Golang 原生网络库两个网络库,用户可以根据自己的场景选择合适的网络库以达到最佳性能。

具体使用和进阶的特性可以参考官方文档。

参考

Hertz 文档

hertz-examples