Protocol Buffer 使用指北

栏目: Java · 发布时间: 7年前

内容简介:最近在负责特征平台服务的开发,最初版本的特征数据存取是使用 JSON String,当时的考量是快速迭代上线,JSON 是个比较简单常用的数据交换格式.这样做在简单数据结构且对性能要求不高的时候是可行的,但是随着这个服务的调用量增大,对性能也有要求,这种做法就不太可行,碰到主要有以下问题:中间件团队建议使用Protocol Buffer,调研之后决定用 Protocol Buffer 来优化一下服务,下面简单介绍下它的使用方法,主要包含三个步骤:新建一个以

最近在负责特征平台服务的开发,最初版本的特征数据存取是使用 JSON String,当时的考量是快速迭代上线,JSON 是个比较简单常用的数据交换格式.这样做在简单数据结构且对性能要求不高的时候是可行的,但是随着这个服务的调用量增大,对性能也有要求,这种做法就不太可行,碰到主要有以下问题:

  • JSON String 在 parse 的时候很慢, 在调用量大的时候经常需要花费几十毫秒的时间,从而导致调用超时.
  • JSON 结构比较占用存储空间,没有进行任何压缩,相对来说网络传输也会更耗时.
  • GC 问题

中间件团队建议使用Protocol Buffer,调研之后决定用 Protocol Buffer 来优化一下服务,下面简单介绍下它的使用方法,主要包含三个步骤:

  1. .proto 文件中定义数据格式
  2. 根据 .proto 文件生成类文件
  3. 使用

1.定义数据格式

新建一个以 .proto 结尾的文件,如新建 mq_message.proto :

// 指定使用哪个版本的语法,需要在第一行指定
syntax = "proto3";

package example;

// 指定 java_package, 不指定就使用 package.生成的类会放到该package下
option java_package = "com.example.example";

// 生成的类名
option java_outer_classname = "MQMessageProtos";

message MQMessage {
  // required 修饰的字段必须提供,否则 build 会抛 RuntimeException, parse 会抛 IOException. 后续扩展时 required 字段不可修改

  // 声明一个枚举类型
  enum OperationType {
    UPDATE = 0;
    DELETE = 1;
  }

  // 声明一个枚举类型的字段,等号后面的数字是标识数字
  OperationType operationType = 1;

  // 声明一个 string 类型的字段
  string name = 2;

  // 声明一个 Item 的 List
  repeated Item items = 3;

}

message Item {
  // 声明一个 string 类型的字段
  string key = 1;

  // 声明一个 map 类型字段
  map<string, string> fields = 2;
}

复制代码
  1. 首先指定语法版本, proto2proto3 有一些差别,详细的可以参考官方文档(可能需要梯子, proto2 , proto3 ),本文中使用 proto3 .
  2. package 和 java_package 指定生成的 Java 类在哪个 package 下,避免命名冲突.
  3. java_outer_classname 指定生成的类名,如果不指定则会根据文件名生成,如: my_proto.proto 则会生成 MyProto 类.
  4. message 是用于数据格式定义.
    • 一个 .proto 文件中可以定义多个 message
    • message 中定义的字段支持 string、byte、bool、map、enum、数字类型和用户自定义的 message
    • 定义字段后面需要指定唯一的标识数字,这些数字用于识别二进制格式 message 中的字段,一旦开始使用这个 message,那么标识数字就不能改变.(数字1-15会用一个字节去编码,大于15的数字会用更多字节去编码,所以尽量把小的数字留个最常出现的字段.指定字段的标识数字时不用按照顺序来.)
    • 如果需要定义 List,则在字段前加repeated即可.
    • 如果已经使用过该 message 生成的类后,想要增加字段直接新增即可.当新增字段的类解析老数据时,会将新字段置为默认值.当旧的类解析新数据时会忽视掉新增字段.

2.根据 .proto 文件生成类文件

定义好 .proto 文件后使用 protocol buffer 编译器编译 .proto 文件即可. 需要在本地安装一下 protocol buffer 编译器,Mac os 直接使用 brew 安装即可: brew install protobuf.其他系统可参照: 官方文档 安装好编译器后执行编译命令:

protoc --java_out=./ ./mq_message.proto
复制代码

--java_out 指定编译后生成的文件所在的目录,最后指定你要编译的文件.

3.使用

下面是根据上面的mq_message.proto文件生成的类的使用例子:

public class TestPB {
    public static void main(String[] args) {
        MQMessageProtos.Item item1 = MQMessageProtos.Item.newBuilder()
                .setKey("1")
                .putFields("field1", "value1")
                .putFields("field2", "value2")
                .build();
        MQMessageProtos.Item item2 = MQMessageProtos.Item.newBuilder()
                .setKey("2")
                .putFields("field3", "value3")
                .putFields("field4", "value4")
                .build();
        MQMessageProtos.MQMessage mqMessage = MQMessageProtos.MQMessage.newBuilder()
                .setName("testName")
                .setOperationType(MQMessageProtos.MQMessage.OperationType.UPDATE)
                .addItems(item1)
                .addItems(item2)
                .build();

        byte[] byteArray = mqMessage.toByteArray();

        try {
            MQMessageProtos.MQMessage message = MQMessageProtos.MQMessage.parseFrom(byteArray);
            System.out.println(message.getName());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}
复制代码

最后欢迎关注我的个人博客:陈敏杰


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ant Colony Optimization

Ant Colony Optimization

Marco Dorigo、Thomas Stützle / A Bradford Book / 2004-6-4 / USD 45.00

The complex social behaviors of ants have been much studied by science, and computer scientists are now finding that these behavior patterns can provide models for solving difficult combinatorial opti......一起来看看 《Ant Colony Optimization》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具