Hertz 是什么
Hertz[həːts] 是字节 CloudWeGo 团队一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。
环境
基础依赖
在开发、部署运行该项目之前,需要有一定的基础环境:
- go v1.16 +
- hz 脚手架工具 v0.6.3
- 支持 win、mac、linux
安装 go
直接参考官方文档:https://go.dev/doc/install
安装命令行脚手架工具 hz
hz 是 Hertz 框架提供的一个用于生成代码的命令行工具。目前,hz 可以基于 thrift 和 protobuf 的 IDL 生成 Hertz 项目的脚手架。
注意:
- 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将
GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
- 安装 hz:go install github.com/cloudwego/hertz/cmd/hz@latest
安装完成后执行命令:
出现如下结果,即为安装成功:
生成代码与运行代码
代码目录确定位置
- 若将代码放置于
GOPATH/src 下创建代码目录,进入该目录后再进行操作
- 直接新建一个项目目录
生成代码
uranus
go.mod
由于这边用的是最新的 go 版本,所以直接用 v1.20。
kronosidl
参考 go 项目基本布局:https://github.com/golang-standards/project-layout/blob/master/README_zh.md
最后,我们需要对当前项目进行环境配置:
设置 go 环境
注:在配置代理时,选择国内的域名进行配置。
插曲
在使用 hz 工具生成代码之前,我们需要先了解下编解码序列化工具:thrift、protobuf
- protocol buffers,谷歌开发的数据序列号格式。以二进制形式有效而紧凑地存储结构化数据,允许在网络连接上更快传输。
- thrift 不仅仅提供全套 rpc 解决方案,包括序列化机制、传输层、并发处理框架等的 rpc 服务框架。利用 idl 文件来定义接口和数据类型。通过 thrift 提供的编译器编译成不同语言代码,以此实现跨语言调用。
protobuf 和 json 的区别
- 速度:在序列化和反序列化数据方面,Protobuf 比 JSON 快得多。由于格式是二进制的,json 是文本格式,Protobuf 中读写结构化数据所需的时间比在 JSON 中要短。
- 大小:Protobuf 比 JSON 小得多,在网络带宽有限的情况下,由于二进制数据流的紧凑性,存储和传输 Protobuf 信息所占用的空间比 JSON 信息要少。
- 数据类型:Protobuf 支持更复杂的数据类型,如枚举和 map
- 平台兼容性:由于 Protobuf 是一种开源格式,语言和平台独立的,它可以在多个平台上使用而没有困难或兼容性问题。
手写一个 IDL 文件
在前面,我们了解到 thrift、protobuf 是什么之后,我们先来手写一个 IDL 文件:
上面写的是一个基于 thrift 的 IDL,同样,我们也可以基于:
当然,由于 thrift、protobuf 在不同场景下具有不同的特性与性能,一般:
- 基于 Streaming 场景下,基于 Protobuf 编码,有两种:Kitex Protobuf 和 gRPC。性能较快
- 其它场景基本基于 thrift 进行序列化编解码即可
代码生成
我们按照前面写的 thrift 模板文件 idl,来依赖 hz 工具生成,在生成代码之前,需要安装相应的编译器 thriftgo、protoc:
对于 protoc,可以参考:
也可以参考官方:https://github.com/protocolbuffers/protobuf
kronos
go mod tidy
运行项目
执行文件:main.go
启动之后,看控制台:
可以看到有几个接口,同时当前服务默认监听端口:8888。
打开一个web ui,访问API接口: