spring boot 引入Protocol Buffer

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

二 Protobuf的语法

使用

  • 创建.proto文件:
syntax = "proto2";
package netty;
option java_package = "cn.xpleaf.protobuf";
option java_outer_classname = "SubscribeReqProto";
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
  repeated PhoneNumber phone = 4;
}

 option java_package : 声明包路径

 option java_outer_classname  : 定义类名,不声明的话它将通过将文件名转换为camel case来生成。例如,默认情况下,“my_proto.proto”将使用“MyProto”作为外部类名。

syntax : 指定语法,指定了语法格式为proto2或proto3,即protobuf 2的语法,默认也是使用proto2的语法。

1 *.proto文件中数据类型可以分为两大类:

复合数据类型 + 标准数据类型

复合数据类型包括:枚举和message类型

标准数据类型包含:

         整型 : int32

          浮点 : float,double

          字符串 : string

          布尔: bool

2 数据类型前面修饰词:

required(必选字段): 必须赋值,不能为空,否则该条message会被认为是“uninitialized”。build一个“uninitialized” message会抛出一个RuntimeException异常,解析一条“uninitialized” message会抛出一条IOException异常。除此之外,“required”字段跟“optional”字段并无差别。

optional(可选字段):字段可以赋值,也可以不赋值。假如没有赋值的话,会被赋上默认值。

repeated(可重复字段): 该字段可以重复任意次数,包括0次。重复数据的顺序将会保存在protocol buffer中,将这个字段想象成一个可以自动设置size的数组就可以了。

3.每个字段要给数字:

该Number是用来标记该字段在序列化后的二进制数据中所在的field,每个字段的Number在message内部都是独一无二的。也不能进行改变,否则数据就不能正确的解包。

  • 安装protoc(win版)

1.下载protobuf

https://github.com/google/protobuf/releases

选择protoc-xxx-win32.zip下载

2.将解压出来的protoc.exe放在一全英文路径下,并把其路径名放在windows环境变量下的path下,同时添加proto_path,值为protoc.exe的路径

3.在所使用的proto文件路径下打开cmd窗口执行以下命令

protoc -I=源地址 --java_out=目标地址  源地址/xxx.proto

  • 编译.protoc文件

在protoc.exe所在目录执行:

.\protoc --java_out=.\ XXX.proto  #注意.\与XXX.proto 中间有空格
  • 引入依赖:
        <!-- protobuf begin -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.6.1</version>
        </dependency>

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>3.6.1</version>
        </dependency>

        <dependency>
            <groupId>com.googlecode.protobuf-java-format</groupId>
            <artifactId>protobuf-java-format</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- protobuf end -->

三、为什么不使用XML?

    相对于XML,protocol buffers在序列化结构数据时拥有许多先进的特性:

    1、更简单

    2、序列化后字节占用空间比XML少3-10倍

    3、序列化的时间效率比XML快20-100倍

    4、具有更少的歧义性

    5、自动生成数据访问类方便应用程序的使用

参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

https://www.jianshu.com/p/708c0e44c897

猜你喜欢

转载自blog.csdn.net/ityqing/article/details/83653184