Protobuf

先简单介绍点知识点:

RMI: 进行远程方法调用 但只针对java

大多数RPC 都存在代码生成,定义好一些规范标准,自动生成代码去实现序列化与反系列化以及网络的传输

client : stub

server: skeleton

客户端通过stub 自动生成代码 与服务器端进行数据交互 服务器端通过skeleton 自动生成代码与客户端进行交互

序列化与反序列化 也叫做 编码与解码 就是将对象进行二进制字节流转换进行通信

RPC:远程过程调用,很多RPC框架都是跨语言的

1.定义一个接口说明文件:描述对象 对象成员 接口方法等一系列信息。

2.通过rpc框架提供的编译器,将接口说明文件编译成具体语言文件

3在客户端与服务器端分别引入RPC编译器所生成的文件,即可像调用本地方法一样调用远程方法

  • Protocol Buffers :

官网 https://developers.google.com/protocol-buffers/ (需要翻墙)

它是一种语言中立,可拓展的机制 用于序列化、结构化的数据。我们以前各模块之间通过HTTP方式 xml、json 的方式交互,并且XML数据冗余容量特别大,通过RPC的方式 极度的压缩来提高效率。

我们可以看到官网的提供的结构: 可以看出它的数据类型,其实RPC支持的语言越多,它的数据类型越少,因为它要取各个语言类型的交集,string name = 1; 并不是表示name的值是1,而是表示它的顺序是1,稍后的例子中将会有介绍。

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}
那么Protocol Buffers 到底是什么呢?

 Protocol Buffers是谷歌的提供语言中立,平台中立,用于序列化数据化数据可拓展的机制,就像XML一样但是它体积更小,更快更简单,你只需要定义数据的结构化文件,你就可以使用特殊生成出来的源代码,这样你就可以轻松的写和读你的结构化文件使用不同的语言,它支持 java c c++ python Go,Ruby 等。

Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
output = new FileOutputStream(args[0]);
john.writeTo(output);
关于它的安装 有相对应的系统安装包,需要安装一下它的编译器

安装完它的编译器 还需要下载它对应的语言包


 并且还需要引用它的jar包protobuf-java、protobuf-lite 这个是移动端的、protobuf-java-util

<dependency>
   <groupId>com.google.protobuf</groupId>
   <artifactId>protobuf-java</artifactId>
   <version>3.5.1</version>
</dependency>
<dependency>
   <groupId>com.google.protobuf</groupId>
   <artifactId>protobuf-java-util</artifactId>
   <version>3.5.1</version>
</dependency>
我们来写一个 java例子:

syntax = "proto2";

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

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 phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}
1.首先我们要定义 消息格式 .proto 格式的文件,.proto文件首先要定义一个包名 package 用来防止不同的消息类型命名冲突,它是用来表示非java语言的区分,java_package是针对java 的包名它表示生成文件位于哪个包当中。java_outer_classname 是生成的类名,如果不写默认会以文件名字按照驼峰标识生成,例如 "my_proto.proto"  生成MyProto作为classname, 如果java_outer_classname ="AddressBookProtos"则生成AddressBookProtos 的class 并且Person 是以它的 内部类形式存在。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值