Skip to content
鼓励作者:欢迎打赏犒劳

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文件只做转发功能,自定义的逻辑最好在新的文件中编写!!!!

如有转载或 CV 的请标注本站原文地址