前言基础知识:
RMI:remote method Invocation 远程方法调用 只针对Java 底层数据通过socket进行传输
A机器上的方法,通过B机器来调用 调用的方式需要序列化成字节码,然后再进行反序列化
Client :stub 桩
Server :skeleton 骨架
序列化(将对象转换成字节编码过程)与反序列化(将字节转换成对象 解码)也叫做:编码与解码
RPC:remote procedure call :远程过程调用,很多RPC框架都是跨语言的,(服务器代码是Python 而客户端java)
使用步骤
- 定义接口说明文件(idl):描述了对象(结构体)、对象成员,接口方法等一系列信息
- 通过RPC框架所提供的编译器,将接口说明文件编译成具体语言文件
- 在客户端与服务器端分别引入RPC编译器所生成的文件,即可调用本地方法一样调用远程方法。
Webservice 也可以当成是一个RPC来看,只不过效率没RPC高。
RPC基于socket 而webservice基于http,效率没有socket高。
接口说明文件;定义数据:类似java中的类
Required:必须的
Optional:可选的
string .. 代表数据类型 name =1 1:代表的是标识,顺序
构造出消息对象并写入到流中
从流中反序列化出来:
开发流程:
* 从Google protobuf首页进入到download页面
*进入到protobuf的GitHub托管中,选择安装protobuf编译器
然后选择指定系统的zip包
下载好之后解压缩之后,编译器在bin目录下
将bin目录放置到环境变量path下:
在cmd中输入protoc即可执行 显示如下
然后再下载一个针对特定语言的压缩包:似乎没有用到
然后需要运行时依赖
这里的话项目中可以通过gradle进行管理
自此:就已经将Google protobuf的开发环境和编译环境配置完毕
使用:
项目中创建文件.proto结构文件
student.proto
syntax="proto2";
//文件特性
package com.test.protobuf;
option optimize_for = SPEED; //加快解析速度 默认是SPEED
option java_package = "com.test.protobuf";
option java_outer_classname = "DataInfo";
message Student{
required string name = 1;
optional int32 age = 2;
optional string address = 3;
}
执行命令在项目中生成对应的目标class文件
protoc --java_out=src/main/java src/protobuf/student.proto
第一个目录是生成目录,第二个目录是proto文件的目标目录
然后就会在目标目录下生成这个class文件
编写测试类测试生成的class类进行序列化与反序列化操作
public class ProtobufTest {
public static void main(String[] args) throws InvalidProtocolBufferException {
//message 只读 只有build 可读写
DataInfo.Student student = DataInfo.Student.newBuilder().
setName("张三").setAge(20).setAddress("湖南").build();
//将对象序列化成字节数组
byte[] student2ByteArray = student.toByteArray();
//再将字节数组反序列化成对象
DataInfo.Student student1 = DataInfo.Student.parseFrom(student2ByteArray);
System.out.println(student1.getName());
System.out.println(student1.getAge());
System.out.println(student1.getAddress());
}
}
自此,使用protobuf完成基础的序列化与反序列化操作