这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
Kitex
基本概念
KiteX 是 bytedance 开源的高性能 RPC 框架,实现了高吞吐、高负载、高性能等居多特性,具体请看 KiteX 的实践,文章介绍多传输协议、消息协议时,说到 KiteX 支持的协议类型:Thrift、Protobuf 等,今天我们主要来实践如何利用 KiteX 基于对应的 IDL 生成对应协议的代码。
Protobuf 简介
Protobuf 全称是 Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,用于数据的通信协议、数据存储等。相对比 XML 来说,其特点:
安装
kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
使用步骤
编写idl
syntax = "proto3";
package favorite;
option go_package = "favorite";
import "feed.proto";
message douyin_favorite_action_request {
int64 user_id = 1; // 用户id
string token = 2; // 用户鉴权token
int64 video_id = 3; // 视频id
int32 action_type = 4; // 1-点赞,2-取消点赞
}
message douyin_favorite_action_response {
int32 status_code = 1; // 状态码,0-成功,其他值-失败
optional string status_msg = 2; // 返回状态描述
}
message douyin_favorite_list_request {
int64 user_id = 1; // 用户id
string token = 2; // 用户鉴权token
}
message douyin_favorite_list_response {
int32 status_code = 1; // 状态码,0-成功,其他值-失败
optional string status_msg = 2; // 返回状态描述
repeated feed.Video video_list = 3; // 用户点赞视频列表
}
service FavoriteSrv{
rpc FavoriteAction(douyin_favorite_action_request) returns (douyin_favorite_action_response); //点赞或取消点赞
rpc FavoriteList(douyin_favorite_list_request) returns (douyin_favorite_list_response); // 返回点赞视频列表
}
生成代码
kitex -module "kitex-examples" -proto frugal_tag -service helloserver idl/favorite.proto
-module module_name
该参数用于指定生成代码所属的 Go 模块,会影响生成代码里的 import path。
如果当前目录是在 下的一个目录,那么可以不指定该参数;会使用GOPATH/src 开始的相对路径作为 import path 前缀。例如,在 $GOPATH/src/example.com/hello/world 下执行 kitex,那么 kitex_gen/example_package/example_package.go 在其他代码代码里的 import path 会是 example.com/hello/world/kitex_gen/example_package。
如果当前目录不在 $GOPATH/src 下,那么必须指定该参数。
如果指定了 -module 参数,那么 kitex 会从当前目录开始往上层搜索 go.mod 文件
如果不存在 go.mod 文件,那么 kitex 会调用 go mod init 生成 go.mod;
如果存在 go.mod 文件,那么 kitex 会检查 -module 的参数和 go.mod 里的模块名字是否一致,如果不一致则会报错退出;
最后,go.mod 的位置及其模块名字会决定生成代码里的 import path。
-service service_name
使用该选项时,kitex 会生成构建一个服务的脚手架代码,参数 service_name 给出启动时服务自身的名字,通常其值取决于使用 Kitex 框架时搭配的服务注册和服务发现功能。