Protobuf规范

命名

统一为xxxID,例如:

  • 对:int64 userID = 1;
  • 错:int64 userId = 1;
  • 错: int64 userid = 1;

包含ID,URL,JSON要求大写,例如:

message AddUserReq {
    int64 userID  = 1;
    string avatarURL = 2;
    string detailJSON = 3;
}

空对象优先使用 .google.protobuf.Empty

service General {
    // RemoveCustomEmoji 移除自定义表情
    rpc RemoveCustomEmoji(RemoveCustomEmojiReq) returns (.google.protobuf.Empty);
    // 获取所有表情(emoji、自定义)
    rpc GetAllEmoji(.google.protobuf.Empty) returns (common.GetAllEmojiRsp);
}

request的结构添加后缀Req,例如:

message LoginReq{

}

response结构添加后缀Rsp,例如:

message LoginRsp{

}

主要目录

  • api:对外开放的api结构
  • common: 多个服务通用的结构
  • rpc: 内容rpc使用的结构

常规用法

例如,获取最新消息:

common/base_im.proto: 公共结构体

option go_package = "gogs.xinyan.tech/beenest/proto/common";  // 可被包含的proto需要全路径

message SessionInfo {
    int64 firstID = 1;
}

message Message {
    string content = 1;
    string seqID = 2;
    int64 fromUser = 3;
}

api/im/im.proto: api请求参数

import "common/base_im.proto";
option go_package = "gogs.xinyan.tech/beenest/proto/api/im"; // 可被包含的proto需要全路径

service Im {
    rpc SyncMsg(SyncMsgReq) returns (SyncMsgRsp);
    rpc SendMsg(SendMsgReq) returns (SendMsgRsp);
}

message SyncMsgReq {
    common.SessionInfo sessionInfo = 1;
    int64 offset = 2;

    //api层不需要使用userID, 大部分rpc层参数都需要userID
    //直接把userID放到api层,rpc使用api层的结构,避免出现大量同名结构
    int64 userID = 3; // 客户端忽略
}

message SyncMsgRsp {
    SessionInfo sessionInfo = 1;
    int64 offset = 2;
}

message SendMsgReq {
    common.SessionInfo sessionInfo = 1;
    common.Message msg = 2;

    //api层不需要使用userID, 大部分rpc层参数都需要userID
    //直接把userID放到api层,rpc使用api层的结构,避免出现大量同名结构
    int64 userID = 3; // 客户端忽略
}

message SendMsgRsp {
    SessionInfo sessionInfo = 1;
    int64 seqID = 2;
}

rpc/im/im.proto: rpc请求参数

import "common/base_im.proto";
import "api/im/im.proto"
option go_package = "impb";

service IMService {
    //返回内容可以直接使用api层定义的结构
    rpc SyncMsg(api.im.SyncMsgReq) returns (api.im.SyncMsgRsp);
    //如果rpc层的req没有额外的内部参数,也可直接使用api层定义的结构
    rpc SendMsgReq(SendMsgReq) returns (api.im.SyncMsgRsp);
}

//相比api层的SyncMsgReq,rpc层有额外的参数extraInfo
//因为声明了一个rpc层的req
message SendMsgReq {
    //引用api层req结构要求命名为apiReq
    api.im.SyncMsgReq apiReq = 1;
    string extraInfo = 2;
}
Copyright © xinyan all right reserved,powered by Gitbook该文件修订时间: 2020-08-11 18:17:46

results matching ""

    No results matching ""