项目中要使用rpc协议框架来实现两个系统之间的接口调用。A系统调用B系统的相应接口,因为考虑到http请求会包含更多冗余信息,造成请求过大,因此选用了rpc众多框架中的grpc。
grpc是google开源的rpc框架,目前版本1.0.0,看jar包引入包括netty与okhttp,同时序列化中使用的是protobuf(google自主研发的序列化方式——支持http2.0与多路复用,同时对数据进行压缩,效率较高,跨平台),目前grpc中的protobuf使用的是3.0最新版本(除了部分语言目前仅支持protobuf 2版本)。

为什么要使用grpc:

RPC可以基于TCP协议也可以基于HTTP协议,基于TCP的RPC协议较为难读,不友好,虽然数据量小精简,但如果对数据速度及IO要求没有那么高,完全可以使用基于HTTP协议的rpc。由于gRPC基于HTTP/2标准设计,所以相对于其他RPC框架,gRPC带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能给移动设备带来重大益处,如节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。同时,gRPC还能够提高了云端服务和Web应用的性能。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。

为什么要使用protobuf:

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。
比json、xml效率更高,以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍。Protobuf 的编程模式比较友好,简单易学。
有两项技术保证了采用 Protobuf 的程序能获得相对于 XML 极大的性能提高:
1. Protobuf 序列化后的信息内容,信息的表示非常紧凑。
Protobuf 序列化后所生成的二进制消息非常紧凑,这得益于 Protobuf 采用的非常巧妙的 Encoding 方法。
2. Protobuf 封解包的大致过程,封解包的速度。
首先我们来了解一下 XML 的封解包过程。XML 需要从文件中读取出字符串,再转换为 XML 文档对象结构模型。之后,再从 XML 文档对象结构模型中读取指定节点的字符串,最后再将这个字符串转换成指定类型的变量。这个过程非常复杂,其中将 XML 文件转换为文档对象结构模型的过程通常需要完成词法文法分析等大量消耗 CPU 的复杂计算。
反观 Protobuf,它只需要简单地将一个二进制序列,按照指定的格式读取到程序对应的结构类型中就可以了。从上一节的描述可以看到消息的 decoding 过程也可以通过几个位移操作组成的表达式计算即可完成。速度非常快。


环境:IntelliJ IDEA 2016 JDK1.8 Gradle3.0
1. gradle安装grpc-all(或maven都可以), compile group: ‘io.grpc’, name: ‘grpc-all’, version: ‘1.0.0’
2. 下载IDEA的插件 Protobuf Support,使得IDEA支持Protobuf文件格式。
3. 在main/resources下创建文件夹proto,用来存放proto文件
4. 创建相应的proto文件,使用protoc.exe对proto文件进行编译,编译成java文件。
5. 然后使用相应的java文件作为message,作为对象使用,序列化、反序列化即可。

之所以结尾很仓促,是因为领导忽然说基于HTTP的RPC会消耗大量资源,不得已转入基于TCP的RPC框架,后续可能会有其他更新,比如基于TCP的Dubbo(淘宝的),序列化可以多种选择,传输则是TCP协议,使用了高性能的NIO框架Netty。