简介
Hertz 是一个 字节跳动公司开发的Golang 微服务 HTTP 框架,具有高易用性、高性能、高扩展性等特点。
Hertz-demo是官方提供的案例,构建一个http服务十分快捷:
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
h := server.Default()
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{
"message": "pong"})
})
h.Spin()
}
在项目级开发的过程中,这样显然是不够的,hertx也提供了hz
工具用于生成标准的http服务目录。如下:
hz new -idl ./demo.thrift
hertz官方也对生成的文件夹有详细的介绍生成代码的结构对此就不在过多赘述。
其中较为核心的是biz/handler
目录,该目录用于继承IDL中service
定义的接口,并重写方法,也就说,该目录是HTTP服务的service层。
biz/model
目录和其名字一样在http服务中是Model层,用于对接数据库和返回视图层数据。
biz/router
目录是路由层,其内部的文件下的文件中定义路由方法。
// Register register routes based on the IDL 'api.${HTTP Method}' annotation.
func Register(r *server.Hertz) {
r.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{
"message": "pong"})
})
}
路由方法在这里也解耦了,也就是上边的
biz/handler
该目录下定义service方法,这些方法都是.HandlerFunc
类型,这里解耦使方法不用都写在路由后面是代码层次清晰。
r.GET()
的方法体都写在handler目录下,router处只负责调用。
上述的调用关系为:
biz/model ===> biz/hanlder ===> biz/router
model定义接受与返回数据,对接数据库与视图接口,handler定义逻辑处理功能,router定义路由功能,分工明确。
需要注意的是上述代码都是可以使用
hz
工具一键生成的,只需要在thrift文件中座相应配置即可。
在项目最外层也有一个router.go
作用是,定义除idl定义外的路由方法,其方法体仍然在biz.handler
下编写。
router_gen.go
是hz
生成的路由注册代码,用于调用用户自定义的路由以及 hz 生成的路由,在启动主函数调用,从而启动全部路由。
也可以把router.go删除,时全部定义在idl中,这样更方便理解,biz目录router调用,其内部的全部路由定义,更目录下router_gen自动调用biz下的router,从而使服务器全部服务启动。
一般情况下直接早thrift文件中配置注解,通过hz自动生成即可。IDL 注解说明
修改thrift文件如下:
namespace go demo
struct addStoreReq{
1:i32 id
2:string storeName
3:i32 type
4:string uuid
5:string identitionTime
6:string createAt
7:i32 status
}
struct deleteReq{
1:i32 id
}
struct updateReq{
1:i32 id
2:string storeName
3:i32 type
4:string uuid
5:string identitionTime
6:string createAt
7:i32 status
}
struct getStoreReq{
1:i32 id
2:string storeName
3:i32 type
4:string uuid
5:string identitionTime
6:string createAt
7:i32 status
}
// 定义HTTP方法,通过hertz注解自动生成
service storeInterface{
i32 addStore(1:addStoreReq req) (api.post="/addstore")
i32 deleteStore(1:deleteReq req) (api.get="/deletestore")
i32 updateStore(1:updateReq req) (api.post="/updatestore")
list<getStoreReq>getStore(1:i32 id 2:string uuid) (api.get="/getstore")
}
使用hz update -idl demo.thrift --module demo
命令生成更新后的thrift文件,如下,发现model下的文件全部报错,原因是的缺少context参数,这是由于thrift版本太高
参考go mod edit -replace github.com/apache/thrift=github.com/apache/[email protected]
使用该命令后再重新生成就可以了。
hz
命令生成的文件是你直接可以使用的,如下生成后无需修改任何代码就能直接启动服务器:
此时只需要修改biz/handler
下的路由逻辑的方法体就可以了。hertz_demo