概念
RPC Remote Procedure Call Protocol——远程过程调用协议。
应用场景:一台计算机通过网络通信从远程计算机(另一台计算机)上请求服务,并得到远程 计算机返回的结果。最常见应用于分布式集群环境中,集群里各节点(计算机)之间的网络通 信。
模式:客户机/服务器的模式。发起请求的叫客户机。
客户机:客户机上有数据,并明确数据应该怎么被处理,但是客户机并没有处理数据的能力 (处理数据的代码或程序,这个程序在其他的计算机上)。所以,客户机想要得到想要的结 果,需要调用远程计算机上的服务(程序)来执行处理并得到结果。
服务机:服务机上没有数据,但却有处理数据的能力(程序)。只要有客户机把数据发过来, 并调用了服务机上的相关方法,服务机便能根据数据来执行方法,得到结果返回并返回给客户 机。
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失 本地调用的语义简洁性。
一次PRC调用的流程:
1.调用客户端句柄;执行传送参数。(句柄有多种含义,一种是程序设计,一种是windows编 程,大部分指的是程序设计。如果是程序设计,确切的说句柄是一种智能指针,这个指针可能 要引用其他系统(比如操作系统)的内存资源)
2.调用客户端本地系统内核发送网络消息
3.消息通过网路传送到远程服务器(另外一台服务器)
4.服务器句柄得到消息并取得参数
5.服务器拿着参数执行对应的方法
6.将结果返回给服务器句柄
7.服务器句柄调用系统内核,将结果通过网络发回客户端
8.客户端收到返回的结果数据
协议结构(仅做浏览)
远程过程调用(RPC)信息协议由两个不同结构组成:调用信息和答复信息。信息流程如下所 示:
RPC:远程过程调用流程
RPC 调用信息:每条远程过程调用信息包括以下无符号整数字段,以独立识别远程过程:
程序号(Program number)
程序版本号(Program version number)
过程号(Procedure number)
RPC 调用信息主体形式如下:
struct call_body {
unsigned int rpcvers;
unsigned int prog;
unsigned int vers;
unsigned int proc;
opaque_auth cred;
opaque_auth verf;
1 parameter
2 parameter . . . };
RPC 答复信息:RPC 协议的答复信息的改变取决于网络服务器对调用信息是接收还是拒绝。 答复信息请求包括区别以下情形的各种信息:
RPC 成功执行调用信息。.
RPC 的远程实现不是协议第二版,返回 RPC 支持的最低和最高版本号。
在远程系统中,远程程序不可用。
远程程序不支持被请求的版本号。返回远程程序所支持的最低和最高版本号。
请求的过程号不存在。通常是呼叫方协议或程序差错。
RPC答复信息形式如下:
enum reply_stat stat
{MSG_ACCEPTED = 0,
MSG_DENIED = 1 };
主流的RPC框架
Thrift:facebook的开源RPC框架,现在贡献给apache。支持多语言之间的RPC通信,facebook当 时在开发Thrift的时候,目的就是为了实现facebook系统内之间的各语言通信。2007年贡献 给apache。
应用
Facebook的开源的日志收集系统(scribe: https://github.com/facebook/scribe)
淘宝的实时数据传输平台(TimeTunnel http://code.taobao.org/p/TimeTunnel/wiki/index)
Evernote开放接口(https://github.com/evernote/evernote-thrift)
Quora(http://www.quora.com/Apache-Thrift)
HBase( http://abloz.com/hbase/book.html#thrift)
…
优点
支持非常多的语言绑定
thrift文件生成目标代码,简单易用
消息定义文件支持注释
数据结构与传输表现的分离,支持多种消息格式
包含完整的客户端/服务端堆栈,可快速实现RPC
支持同步和异步通信
缺点
和protobuf一样不支持动态特性
Protocol Buffer:是Google开源的RPC框架,可以跨平台使用,目前支持的语言:C++,java,python。(没 有thrift多)。
优点
二进制消息,性能好/效率高(空间和时间效率都很不错)
proto文件生成目标代码,简单易用
序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种 方式)
支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
持多种语言(可以把proto文件看做IDL文件)
Netty等一些框架集成
缺点
官方只支持C++,JAVA和Python语言绑定
二进制可读性差(貌似提供了Text_Fromat功能)
二进制不具有自描述特性
默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
只涉及序列化和反序列化技术,不涉及RPC功能(类似XML或者JSON的解析器)
Apache Avro:
应用
Hadoop RPC (http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F)
优点
二进制消息,性能好/效率高
使用JSON描述模式
模式和数据统一存储,消息自描述,不需要生成stub代码(支持生成IDL)
RPC调用在握手阶段交换模式定义
包含完整的客户端/服务端堆栈,可快速实现RPC
支持同步和异步通信
支持动态消息
模式定义允许定义数据的排序(序列化时会遵循这个顺序)
提供了基于Jetty内核的服务基于Netty的服务
缺点
只支持Avro自己的序列化格式
语言绑定不如Thrift丰富
RPC框架具有的特点:
1.基于rpc协议
2.有自定义的一套序列化和反序列的机制 3.客户端通过代理机制调用远程方法
4.服务端通过回调机制执行方法及返回结果
HTTP协议和RPC协议
http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。但是如果是一个大型 的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长 链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一 般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感 知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理, RPC框架是一个强力的支撑