这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
Hertz是字节跳动开源的一个Golang微服务HTTP框架,它结合了其他框架 fasthttp、gin、echo 的优势,使其具有高易用性、高性能、高扩展性等特点。
1 快速代码生成工具
Hertz官方提供了hz命令行工具帮助开发者快速的构建项目框架,我这里使用hz工具基于 thrift IDL 来快速创建项目我的项目。
由于是第一次使用也踩了一些坑,这里做一个总结:
- hz工具在Windows平台下还存在一定的问题,因此我只能使用WSL来作为我的开发环境;
- 基于IDL构建项目时,可以使用
hz new -idl idl/xxx.thrift -mod xxx命令,除了添加-idl参数还应该添加-mod参数; - 基于IDL更新项目时,可以使用
hz update -idl idl/xxx.thrift命令,这时就不需要添加-mod参数; - 依据官方示例,我在编写 thrift IDL 文件时,对请求和响应时的参数使用帕斯卡命名法命名,这样直接按照上面的方法生成代码时,对应的golang结构体的
json标签依旧会以帕斯卡命名法命名:
对应生成的Golang结构体:// demo.thrift struct UserRegisterResp { 1: required i32 StatusCode; 2: optional string StatusMsg; 3: required i64 UserID; 4: required string Token; }我们需要添加type UserRegisterResp struct { StatusCode int32 `thrift:"StatusCode,1,required" form:"StatusCode,required" json:"StatusCode,required" query:"StatusCode,required"` StatusMsg *string `thrift:"StatusMsg,2,optional" form:"StatusMsg" json:"StatusMsg,omitempty" query:"StatusMsg"` UserID int64 `thrift:"UserID,3,required" form:"UserID,required" json:"UserID,required" query:"UserID,required"` Token string `thrift:"Token,4,required" form:"Token,required" json:"Token,required" query:"Token,required"` }--snake_tag参数来避免这种问题,比如hz update -idl idl/xxx.thrift --snake_tag
2 中间件
2.1 添加中间件
在生成的biz/router文件夹下会每个thrift文件会对应一个路由注册(根据namespace命名)和中间件的注册,我们可以工具需求在middleware.go中添加中间件。
2.2 日志打印
通过hz new构建的项目中,默认是没有日志打印的中间件的,因此我们需要手动添加:
// https://www.cloudwego.io/zh/docs/hertz/tutorials/basic-feature/log/
func AccessLog() app.HandlerFunc {
return func(c context.Context, ctx *app.RequestContext) {
start := time.Now()
ctx.Next(c)
end := time.Now()
latency := end.Sub(start).Microseconds
hlog.CtxTracef(c, "status=%d cost=%d method=%s full_path=%s client_ip=%s host=%s",
ctx.Response.StatusCode(), latency,
ctx.Request.Header.Method(), ctx.Request.URI().PathOriginal(), ctx.ClientIP(), ctx.Request.Host())
}
}
注册全局的中间件:
h := server.Default()
h.Use(middleware.AccessLog())
register(h)
h.Spin()
3 Handler方法的编写
在biz/handler文件夹下就对应着 thrift IDL 文件下的每个Service,所有的请求和响应参数都绑定到了对应的Golang结构体上,我们只需要编写对应的逻辑部分,而不需要关系路由注册、请求方法等其它信息。
4 数据库交互
Hert官方提供了搭配Gorm实现数据库访问的示例,我们只需要新建一个dal的包,对数据库的表进行操作即可:
值得注意的是biz/model下并没有数据库表的结构体映射,需要自己编写对应的结构体代码。