上篇文章谈到了thrift,这次来讲讲在公司用到的另外一个协议pb3
惯例,先看看介绍
什么是pb
a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more.
百度上这么介绍的 protocolbuffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
数据类型
- bool,double,float,int32,int64,string等
- 限定修饰符包含
1.required 必须
2.optional 可选
3.repeated 重复,可用来定义集合 - 集合表示方式 repeated int64 userId;
编写proto文件
syntax = "proto3"; //须显式声明为proto3 否则默认为proto2
option java_package = "com.shyn.test";
option java_outer_classname = "TestProtobuf";
//import "rpc.global.structure.proto"; //可引用其他proto文件定义
//定义"类"
message UserData {
required int64 userId = 1;
string username = 2;
string mobile = 3;
}
message GetUserListResp {
int32 errorCode = 1; //byte类型也用int32表示
string errorMsg = 2;
repeated UserData userData = 3; //集合
}
//枚举示例
enum WEEK {
Should_Never_Used = 0; //protobuf3中要求第一个枚举值必须为0 仅为占位符
MONDAY = 1;
TUESDAY = 2;
}
java API
TestProtobuf.GetUserListResp.Builder respBuilder = TestProtobuf.GetUserListResp.newBuilder(); // 构建对象
respBuilder.setErrorCode(0);
respBuilder.setErrorMsg("Test");
for(int i = 0; i < 3; i++) {
TestProtobuf.UserData.Builder userDateBuilder = TestProtobuf.UserData.newBuilder();
userDateBuilder.setUserId(i);
userDateBuilder.setUserName("Shyn");
respBuilder.addUserData(userDateBuilder.build()); //给集合中添加元素
}
respBuilder.getUserDataList(); // 获取集合
生成Java代码
protoc.exe --java_out=./ xxx.proto
至此算是对pb协议有了个简单了解!
不久前老大安排我开始一人去研究ELK日志追踪,算是又学到了不少东西吧,等弄得相对完善了再分享给大家吧!