hertz 生成抖音项目框架 | 青训营笔记

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

一、生成初始项目框架

1.在 ./home/go/src/github.com/cloudwego 目录下创建目标项目文件夹

 mkdir douyin

image.png

2.进入文件夹,利用 hz 命令行工具生成原始项目基本代码文件

 cd douyin
 hz new

image.png 将会生成 douyin/biz 业务代码文件夹,用于存放业务逻辑相关流程。

二、根据 IDL 生成路由和通信实体

1.在项目文件夹下创建 idl 文件夹

 mkdir idl

image.png

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 文件。

image.png

项目文件目录如图。

4.利用 hertz 命令生成代码

 // GOPATH 下执行, 如果主IDL的依赖和主IDL不在同一路径下,需要加入 -I 选项,其含义为IDL搜索路径,等同于 protoc 的 -I 命令
 hz new -I idl -idl idl/douyin/douyin.proto

image.png

将生成如上图所示的项目的结构和代码。此处生成的 handle 代码有误,需要将结构体名称换成 modle 下对应文件中结构体的名称。

三、生成代码结构

将根据上图所示的代码结构进行说明

biz 文件夹

通过 IDL 生成的文件主要分布在此文件夹,在生成框架中属于 business 层,用于存放业务逻辑相关流程,文件夹下有三个文件夹,分别是

  • handle:存放通信实体,通过 IDL 生成的文件是 ./biz/handle/douyin/douyin_service.go 是我们在 IDL 中定义的服务,是路由以后的通信实体
  • model:存放通过 IDL 生成的对应通信过程中的信息模型,其中的 douyin.pb.go 文件便是生成的通信模型,其中规定了不同服务请求和响应的结构体。
  • router:用于存放服务对应的路由、注册和中间件信息,单独有一个注册函数用于注册,中间件可以以热插拔的形式加入到路由通信中。