Hertz 框架使用 | 青训营笔记

108 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

目前正在逐步开展青训营大项目的开发,这里记录一下 Hertz 框架的使用流程。

Hertz 是基于 Gin 基础上开发的 Golang 微服务 HTTP 框架,具有高易用性、高性能、高扩展性等特点,本次开发中尤其对其开箱即用的特点印象深刻。

首先要安装命令行工具 hz

go install github.com/cloudwego/hertz/cmd/hz@latest
# 测试
hz -v
# 进入项目文件夹,生成项目架构
hz new -mod hertz_demo
go mod tidy

此时自动生成的项目结构如下:

hertz_demo
├── biz                                // business 层,存放业务逻辑相关流程
│   ├── handler                        // 存放 handler 文件,对应不同的请求
│   │   └── ping.go                    // 默认携带的 ping handler,用于生成代码快速调试,无其他特殊含义
│   ├── model                          // IDL 内容相关的生成代码
│   └── router                         // idl 中定义的路由相关生成代码
│       └── register.go                // 注册每一个 idl 文件中的路由定义;当有新的 idl 加入,在更新的时候会自动插入其路由注册的调用;不要动
├── go.mod                             // go.mod 文件
├── idl                                // 用户定义的idl,位置可任意
├── main.go                            // 程序入口
├── router.go                          // 用户自定义除 idl 外的路由方法
└── router_gen.go                      // hz 生成的路由注册代码,用于调用用户自定义的路由以及 hz 生成的路由

之后在 idl 文件下编写自己的对接口的定义,这里选择用 protobuf3,使用之前要下载 protoc 工具并加入环境变量 ,比如在 idl 文件夹下新建 user 文件夹,然后,在里面新建 user.proto 文件夹:

syntax = "proto3";

package user;

option go_package = "hertz_demo/user";

import "api.proto";

message User {
  int64 id = 1;
  string name = 2;
  int64 follow_count = 3;
  int64 follower_count = 4;
  bool is_follow = 5;
}

message UserRequest {
  int64  user_id = 1[(api.query)="user_id"]; // 用户 id
  string token = 2[(api.query)="token"]; // 用户鉴权 token
}

message UserResponse {
  int32 status_code = 1;          //状态码,0-成功,其他值-失败
  optional string status_msg = 2; //返回状态描述
  User user = 3;
}

message UserLoginRequest {
  string username = 1[(api.query)="username"]; //登录用户名,最长32个字符
  string password = 2[(api.query)="password"]; //登录密码,最长32个字符
}

message UserLoginResponse {
  int32 status_code = 1;          //状态码,0-成功,其他值-失败
  optional string status_msg = 2; //返回状态描述
  int64 user_id = 3;              //用户id
  string token = 4;               //用户鉴权token
}

service UserService {
  rpc User(UserRequest) returns (UserResponse) {
    option (api.get) = "/douyin/user/";
  }
  rpc UserLogin(UserLoginRequest) returns (UserLoginResponse) {
    option (api.post) = "/douyin/user/login/";
  }
}

由于是 windows 环境开发,用管理员身份打开 cmd,执行 hz new -idl idl/user/user.proto,此时会发现biz文件夹下的 model 文件夹中添加了对应两个结构输入输出数据结构的两个结构体定义,以及handler文件夹中对 "/douyin/user/" 和 "/douyin/user/login/" 两个接口的处理,并且做了基本的数据格式校验,之后只要在中间加入对应的业务代码就可以完成全部功能,确实非常方便。

之后如果需要对接口文件进行调整,如新增接口、修改输入输出格式、修改输入输出数据的解析方式(url或者body),都只需要修改 user.proto 文件并且执行 hz update -idl idl/user/user.proto,会自动更新 model 文件夹下的内容,而不影响业务代码的原有逻辑。