Kitex 与 Hertz
刚刚初步学习使用 Kitex,让我们方便地进行 RPC 调用,它要解决的是内部不同组件之间的协作,可以说“对内”。对内可以相对灵活,为了性能可以定制通信协议,HTTP不是必须的。那么有“对内”就有“对外”,对外也就是面对用户,需要提供标准的基于 Web 服务,需要实现路由、中间件、请求处理等功能,而这些相对标准化、流程化的工作可以由 HTTP 框架来帮助完成,它们能自动生成部分代码,隐藏部分调用细节,Hertz 就是这些框架中的一种。
所以我们要接着学习一种 HTTP 框架的使用,比如 Hertz,gin,fiber,echo 等都可以,选一种适合使用习惯的就好。
Hertz
Hertz[həːts] 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。 如今越来越多的微服务选择使用 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 提供了
GET、POST、PUT、DELETE、ANY等方法用于注册路由。 -
路由组:Hertz 提供了路由组 (
Group) 的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。 -
丰富的路由类型:Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由 (命名参数、通配参数)。
路由的优先级:静态路由 > 命名参数路由 > 通配参数路由
-
功能丰富的客户端。
-
网络库:Hertz 默认集成了 Netpoll 和 Golang 原生网络库两个网络库,用户可以根据自己的场景选择合适的网络库以达到最佳性能。
具体使用和进阶的特性可以参考官方文档。