Skip to content

davyxu/protoplus

Repository files navigation

protoplus

适用于游戏开发的协议格式、代码生成器及相关开发API

Why ProtoPlus?

Protobuf作为行业通用的协议格式已经存在多年,各种历史遗留问题及语言设计上的缺陷对游戏开发阻碍非常大。

为了提高协议编写效率,增加协议使用灵活度,急需一套强于Protobuf的工具集提高开发效率和使用便捷性,ProtoPlus应运而生!

特性对比

___ ProtoPlus Protobuf
生成字段Tag 自动/手动 手动
生成枚举值 自动/手动 手动
注释扩展 API简单 API复杂
字段扩展 专属API支持 手动解析注释
结构扩展 专属API支持 手动解析注释
消息ID生成 自动/手动 不支持
路由表生成 支持 不支持
扩展方式 描述文件输出JSON 复杂的插件格式,调试复杂

注:

  • ProtoPlus中的枚举值,不再需要为了兼容C++而必须加上前缀,保证全局枚举值唯一

  • ProtoPlus二进制编码格式与Protobuf一致,方便调试、分析、优化

描述文件格式


enum Vocation {
	Monkey
	Monk
	Pig
}

struct PhoneNumber {

	number string

	type int32
}


struct Person {

	name string

	id  int32

	email string

	phone PhoneNumber

	voc Vocation
}

struct AddressBook {

	person []Person
}


协议类型及输出语言类型对应

描述 ProtoPlus Go C# Protobuf
32位整形 int32 int32 int int32
64位整形 int64 int64 long int64
无符号32位整形 uint32 uint32 uint uint32
无符号64位整形 uint64 uint64 ulong uint64
字符串 string string string string
单精度浮点数 float32 float32 float float
双精度浮点数 float64 float64 double double
二进制数据 bytes []byte byte[] repeated byte
枚举 enum int32类型常量封装 enum enum
布尔 bool bool bool bool
结构体 struct struct class message

编译

	go get -u -v github.com/davyxu/protoplus/cmd/protoplus

功能

输出ProtoPlus编码消息序列化的Go源码

命令行示例:

protoplus --ppgo_out=msg_gen.go --package=proto proto1.proto proto2.proto

参数说明:

  • ppgo_out

    Go源码文件名

  • package

    指定输出时的Go包名

输出消息绑定的Go源码

输出源码被引用时, 自动注册到cellnet的消息Registry中

命令行示例:

protoplus --ppgoreg_out=msg_gen.go --package=proto proto1.proto proto2.proto

参数说明:

  • ppgoreg_out

    Go源码文件名

  • package

    指定输出时的Go包名

  • codec
    生成消息注册的默认编码,如在消息中指定编码时,优先使用指定的编码

输出ProtoPlus编码的消息序列化C#源码

输出的C#源码, 需要配合ProtoPlus C# SDK 使用

命令行示例:

protoplus --ppcs_out=MsgGen.cs --package=Proto proto1.proto proto2.proto

参数说明:

  • ppcs_out

    C#源码文件名

  • package

    指定输出时的C#命名空间

  • classbase

    C#代码生成时,消息类默认基类名称, 默认基类为IProtoStruct

输出消息绑定的C#源码

输出的C#源码, 需要配合ProtoPlus C# SDK 使用

命令行示例:

protoplus --ppcsreg_out=MsgGen.cs --package=Proto proto1.proto proto2.proto

参数说明:

  • ppcsreg_out

    C#源码文件名

  • package

    指定输出时的C#命名空间

输出Protobuf协议描述文件

输出的Protobuf协议描述文件,可使用protoc编译器编译

命令行示例:

protoplus --pbscheme_out=pb.proto --package=proto proto1.proto proto2.proto

参数说明:

  • pbscheme_out

    生成protobuf 3.0协议文件

  • package

    指定输出时的Protobuf包名

输出ProtoPlus描述文件

ProtoPlus协议描述文件可输出为JSON格式, 方便插件及工具链获取ProtoPlus的格式信息

命令行示例:

protoplus --ppscheme_out=pp.json proto1.proto proto2.proto

参数说明:

也可将描述文件的JSON直接输出,示例如下:

protoplus --ppscheme proto1.proto proto2.proto

输出路由配置

在结构体上添加MsgDir字段,标记结构体作为消息时的消息流转方向, 格式范例:

[MsgDir: "client -> game"]
struct LoginREQ {
}

路由信息将输出为JSON格式:

{
  "Rule": [
     {
        "MsgName": "proto.LoginREQ",
        "SvcName": "game"
     }
  ]
}

MsgDir格式说明

MsgDir的格式包含3个部分

    MsgDir: From -> Mid -> To
  • From

    消息的发起方,路由一般忽略此部分信息

  • Mid

    消息的中间处理, 一般为网关或者路由等

  • To

    消息的目标送达点,消息处理最终方, 一般为某种消息服务, 路由表的SvcName字段读取该字段

命令行示例:

protoplus --route_out=route.json --package=proto proto1.proto proto2.proto

参数说明:

  • route_out

    JSON格式的ProtoPlus路由配置, 格式参见 路由定义

  • package

    指定输出时消息的包名

也可将路由信息的JSON直接输出,示例如下:

protoplus --route --package=proto proto1.proto proto2.proto

备注

感觉不错请star, 谢谢!

提交bug及特性: https://github.com/davyxu/protoplus/issues

About

通用的协议IDL工具, 代替Protobuf

Resources

License

Stars

Watchers

Forks

Packages

No packages published