Hertz 是什么
Hertz[həːts] 是字节 CloudWeGo 团队一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。
在开发、部署运行该项目之前,需要有一定的基础环境:
直接参考官方文档:https://go.dev/doc/install
hz 是 Hertz 框架提供的一个用于生成代码的命令行工具。目前,hz 可以基于 thrift 和 protobuf 的 IDL 生成 Hertz 项目的脚手架。
注意:
GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
安装完成后执行命令:
hz -version
出现如下结果,即为安装成功:
hz version v0.6.4
GOPATH/src 下创建代码目录,进入该目录后再进行操作
我们选择方式二:在任一目录新建一个项目uranus
,如下图:
由于我们是做一个大的项目工程,类似 Java 的父子工程,所以我们需要先建立一个依赖,新建一个go.mod
文件:
go 1.20
由于这边用的是最新的 go 版本,所以直接用 v1.20。
然后我们新建今天的第一个项目:kronos
,由于我们后面的编解码都是通过 idl 文件进行生成,所以这里需要用到idl
目录,然后我们再创建一个 pkg 目录,来专门存放工具库,综合目录情况如下:
参考 go 项目基本布局:https://github.com/golang-standards/project-layout/blob/master/README_zh.md
最后,我们需要对当前项目进行环境配置:
设置 go 环境
注:在配置代理时,选择国内的域名进行配置。
在使用 hz 工具生成代码之前,我们需要先了解下编解码序列化工具:thrift、protobuf
protobuf 和 json 的区别
在前面,我们了解到 thrift、protobuf 是什么之后,我们先来手写一个 IDL 文件:
namespace go hello
struct Request {
1: string name
2: string age
}
struct Response {
1: i8 code
2: string msg
3: map<string,string> data
}
service HelloApi {
Response echo(1: Request req)
}
上面写的是一个基于 thrift 的 IDL,同样,我们也可以基于:
syntax = "proto3";
package elena;
option go_package = "elena";
message BaseResp {
int16 code = 1;
string msg = 2;
}
message Elena {
int64 id = 1;
string name = 2;
string pthone = 3;
string password = 4;
}
message CreateRequest {
string name = 1;
string password = 2;
string pthone = 3;
}
message CreateResponse {
BaseResp result = 1;
string data = 2;
}
service ElenaService {
rpc CreateElena (CreateRequest) returns (CreateResponse) {}
}
当然,由于 thrift、protobuf 在不同场景下具有不同的特性与性能,一般:
我们按照前面写的 thrift 模板文件 idl,来依赖 hz 工具生成,在生成代码之前,需要安装相应的编译器 thriftgo、protoc:
go install github.com/cloudwego/thriftgo@latest
对于 protoc,可以参考:
// brew 安装
$ brew install protobuf
// 官方镜像安装,以 macos 为例
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip
$ unzip protoc-3.19.4-osx-x86_64.zip
$ cp bin/protoc /usr/local/bin/protoc
// 确保 include/google 放入 /usr/local/include下
$ cp -r include/google /usr/local/include/google
也可以参考官方:https://github.com/protocolbuffers/protobuf
安装完成编译器后,我们进入目录kronos
,执行:
hz new -module kronos --idl ../idl/hello.thrift -t=template=slim
hz update ../idl/hello.thrift -t=template=slim
go mod tidy
注意,在生成代码后,需要进行微调,目录结构、go.mod 等不同,会出现一些小问题,同时需要执行:go mod tidy
进行整理。
执行文件:main.go
启动之后,看控制台:
可以看到有几个接口,同时当前服务默认监听端口:8888。
打开一个web ui,访问API接口: