这是我参与「第五届青训营 」伴学笔记创作活动的第 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 文件夹下的内容,而不影响业务代码的原有逻辑。