天天看點

ProtoBuf3.0-1

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);
  }
}