这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
一、生成初始项目框架
1.在 ./home/go/src/github.com/cloudwego 目录下创建目标项目文件夹
mkdir douyin
2.进入文件夹,利用 hz 命令行工具生成原始项目基本代码文件
cd douyin
hz new
将会生成
douyin/biz 业务代码文件夹,用于存放业务逻辑相关流程。
二、根据 IDL 生成路由和通信实体
1.在项目文件夹下创建 idl 文件夹
mkdir idl
2.为在 protobuf 中支持 api 注解,请在使用了注解的 proto 文件中,import 下面的 api.proto 文件
// idl/api.proto; 注解拓展
syntax = "proto2";
package api;
import "google/protobuf/descriptor.proto";
option go_package = "/api";
extend google.protobuf.FieldOptions {
optional string raw_body = 50101;
optional string query = 50102;
optional string header = 50103;
optional string cookie = 50104;
optional string body = 50105;
optional string path = 50106;
optional string vd = 50107;
optional string form = 50108;
optional string go_tag = 51001;
optional string js_conv = 50109;
}
extend google.protobuf.MethodOptions {
optional string get = 50201;
optional string post = 50202;
optional string put = 50203;
optional string delete = 50204;
optional string patch = 50205;
optional string options = 50206;
optional string head = 50207;
optional string any = 50208;
optional string gen_path = 50301;
optional string api_version = 50302;
optional string tag = 50303;
optional string name = 50304;
optional string api_level = 50305;
optional string serializer = 50306;
optional string param = 50307;
optional string baseurl = 50308;
}
extend google.protobuf.EnumValueOptions {
optional int32 http_code = 50401;
}
文件在 IDL 目录下创建,主 IDL 文件中需要将以上文件当做依赖导入。
3.在 IDL 文件夹下创建主 IDL
mkdir douyin
此文件夹将存放主 IDL 的文件,创建 douyin.proto 文件,将项目规定的 protobuf 接口定义写入此文件。注意不要忘记导入上层文件夹下的 api.proto 文件。
项目文件目录如图。
4.利用 hertz 命令生成代码
// GOPATH 下执行, 如果主IDL的依赖和主IDL不在同一路径下,需要加入 -I 选项,其含义为IDL搜索路径,等同于 protoc 的 -I 命令
hz new -I idl -idl idl/douyin/douyin.proto
将生成如上图所示的项目的结构和代码。此处生成的 handle 代码有误,需要将结构体名称换成 modle 下对应文件中结构体的名称。
三、生成代码结构
将根据上图所示的代码结构进行说明
biz 文件夹
通过 IDL 生成的文件主要分布在此文件夹,在生成框架中属于 business 层,用于存放业务逻辑相关流程,文件夹下有三个文件夹,分别是
- handle:存放通信实体,通过 IDL 生成的文件是
./biz/handle/douyin/douyin_service.go是我们在 IDL 中定义的服务,是路由以后的通信实体 - model:存放通过 IDL 生成的对应通信过程中的信息模型,其中的 douyin.pb.go 文件便是生成的通信模型,其中规定了不同服务请求和响应的结构体。
- router:用于存放服务对应的路由、注册和中间件信息,单独有一个注册函数用于注册,中间件可以以热插拔的形式加入到路由通信中。