syntax="proto3";
option java_outer_classname="MonitorDataPojo";
option java_package="com.rhb.rpc.protobuf.pojo";
import public "google/protobuf/timestamp.proto";
message MonitorData{
google.protobuf.Timestamp option = 1;
int64 longValue = 2;
string host =3;
map<string,string> tags = 4;
string cluster=5;
string routeKey=6;
message QueryRequest{
string queryField=1;
string queryValue=2;
double score=3;
bool isLike=4;
}
enum RunStatus{
UNKNOW=0;
RUNNING=1;
STOP=2;
}
QueryRequest queryRequest=7;
RunStatus runStatus=8;
}
主要注意點:
1. rpc協定之ProtoBuf
- message 消息體定義
- option 參數設定
- int32\string... 資料類型
- 常用關鍵字
> 使用protobuf,首先安裝編譯器,idea整合編譯器,使用插件GenProtoBuf.
在Tool->Configure GenProtoBuf中配置編譯器的運作目錄,以及指定,檔案
生成後“相對路徑的根目錄”,指定編譯的方法:安裝插件後,右鍵.proto
檔案,選擇quick gen protobuf rules,生成java檔案。
ProtoBuf3.0文法詳解,參考部落格
> 與JSON序列化比較測試樣例
public class RpcApplication {
public static void main(String[] args) {
test1();
test2();
}
public static void test1(){
Builder builder = MonitorData.newBuilder();
builder.setCluster("cluster-1");
builder.setHost("127.0.0.1");
builder.setLongValue(955595L);
builder.setRouteKey("key-5656");
builder.setRunStatus(RunStatus.RUNNING);
builder.setQueryRequest(QueryRequest.newBuilder()
.setQueryField("name")
.setQueryValue("測試")
.setIsLike(Boolean.FALSE)
.setScore(0.0d).build());
MonitorData monitorData = builder.build();
// 序列化
byte[] bytes = monitorData.toByteArray();
try {
// 反序列化
MonitorData monitorData1 = MonitorData.parseFrom(bytes);
System.out.println(monitorData1.getRouteKey());
System.out.println(monitorData1.getCluster());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
System.out.println(Arrays.toString(bytes));
System.out.println(bytes.length);
}
public static void test2(){
com.rhb.rpc.json.MonitorData data = com.rhb.rpc.json.MonitorData.builder()
.host("127.0.0.1")
.cluster("cluster-1")
.longValue(955595L)
.routeKey("key-5656")
.runStatus(com.rhb.rpc.json.MonitorData.RunStatus.RUNNING)
.request(com.rhb.rpc.json.MonitorData.QueryRequest.builder()
.isLike(Boolean.FALSE)
.queryField("name")
.queryValue("測試")
.score(0.0d).build()).build();
JSONObject jsonObject = JSONUtil.parseObj(data);
byte[] bytes = jsonObject.toString().getBytes();
System.out.println(Arrays.toString(bytes));
System.out.println(bytes.length);
}
}