
hertz代码生成
- 统一数据结构和接口定义,减少手动编写重复代码的错误
- 自动生成模型、路由、handler 骨架等代码
- 便于实现多语言服务间的通信,以及与 RPC 框架(如 Kitex)无缝集成
- 接口变更只需修改 IDL 并重新生成,减少手动修改代码的工作量和失误
需要的环境
Thrift 编译器
将 .thrift 接口定义文件 (IDL) 编译生成目标语言(如 Go)的代码
windows下载地址:
mac环境
brew install thrift
确保安装后 thrift -version
命令可以执行
hz命令行工具:
Hertz 框架提供的命令行工具,用于根据 Thrift IDL 生成 Hertz HTTP 服务的脚手架代码。 go install github.com/cloudwego/hertz/cmd/hz@latest
,安装后确保 hz -v 命令可以执行
代码生成
创建文件夹,比如hertz-thrift-demo。然后我们需要先准备一个thrift文件,才能自动生成代码
编写idl文件
创建idl/hello.thrift
文件
txt
namespace go example.hello // 指定生成的 Go 代码的包名和命名空间,其实上也就是自动生成代码的那部分的文件路径
// 请求结构体
struct HelloRequest {
1: required string name (api.body="name", api.query="name"); // 表示该字段同时可以从请求体和查询参数中获取
2: optional i32 age (api.query="age"); // 可选字段,从查询参数获取
}
// 响应结构体
struct HelloResponse {
1: required string message;
2: required i32 code;
}
// 定义 HTTP 服务接口
service HelloService {
// `api.post` 指定 HTTP 方法为 POST, `/hello` 指定路由
HelloResponse SayHello(1: HelloRequest req) (api.post="/hello");
}
执行命令
注意,因为是空文件夹,所以我们要指定一个 --module 的参数,不然会报错。假如项目中已经有了mod文件,就不需要指定了。
假如你已经存在mod文件,然后你还是指定了--module 的参数,会报错提示你移除 --module
假如代码已经生成了,但是你依然执行 hz new 命令,会报错提示你 已经存在hz项目,如果需要重新生成,需要后面加上 -force
再次注意!!!,有的教程说 后面加上 -t template=slim 参数,即 `hz new --module user-service --idl idl/hello.thrift -t template=slim `
就会生成更加简洁的代码,我测试了下,发现加不加都一样,没什么区别,这是因为hz v0.4.0 开始,slim 成为默认模板。
⚠️ 从 hz v0.5.0+ 起,官方已移除 default 模板,slim 是唯一模板。
生成代码
shell
hz new --module user-service --idl idl/hello.thrift
# 如果已有项目,更新 IDL 后可使用以下命令更新代码
# hz update --idl idl/hello.thrift
代码结构
text
E:.
│ .gitignore
│ .hz
│ go.mod
│ main.go
│ router.go
│ router_gen.go
│
├─biz
│ ├─handler
│ │ │ ping.go
│ │ │
│ │ └─example
│ │ └─hello
│ │ hello_service.go
│ │
│ ├─model
│ │ └─example
│ │ └─hello
│ │ hello.go
│ │
│ └─router
│ │ register.go
│ │
│ └─example
│ └─hello
│ hello.go
│ middleware.go
│
└─idl
hello.thrift
如何自定义逻辑
这个是最最最让人关心的一点,就是代码骨架都是自动生成的,那么我们如何修改呢?那些可以动,那么不可以动呢? 动了之后,如果thrift文件有修改,再次 生成会覆盖修改的代码么?一个一个来。
那些可以动,那么不可以动? 自动生成的都不建议动。但是可以动handler下的service代码,毕竟接口确实是走的这里面,业务逻辑也只能在这里改,但是不要担心,即便是你修改了 业务逻辑代码,但是重新生成代码的话,不会被覆盖,hz非常的智能!!!
还是强烈建议,自动代码的service文件只做转发功能,自定义的逻辑最好在新的文件中编写!!!!