RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高。但是RPC本身的构成却比较复杂,由于受到编程语言,网络模型,使用习惯的约束,有大量的妥协和取舍之处。本文就是通过分析几种流行的RPC实现案例,提供大家在设计RPC系统时的参考。
由于RPC底层的网络开发一般和具体使用环境有关,而编程实现手段也非常多样化,但不影响使用者,因此本文基本涉及如何实现一个RPC系统。
认识RPC(远程调用)
我们在各种操作系统,编程语言生态圈中,多少都会接触过“远程调用”的概念,一般来说,他们指的是用简单的一行代码,通过网络调用另外一个计算机上的某段程序比。如:
-
<李>
RMI远程方法调用:调用远程的方法。”方法”一般是附属于某个对象上的,所以通常RMI指对在远程的计算机上的某个对象,进行其方法函数的调用。
李>
<李>
RPC(远程过程调用:远程过程调用。指的是对网络上另外一个计算机上的,某段特定的函数代码的调用。
李>
远程调用本身是网络通信的一种概念,他的特点是把网络通信封装成一个类似函数的调用。网络通信在远程调用外,一般还有其他的几种概念:数据包处理,消息队列,流过滤,资源拉取等待。下面比较一下他们差异:
方案
编程方式
信息封装
传输模型
典型应用
远程调用
调用函数、输入参数,获得返回值。
使用编程语言的变量,类型,函数
发出请求,获得响应
Java RMI
数据包处理
调用发送()/Recv(),使用字节码数据,编解码,处理内容
把通信内容构造成二进制的协议包
发送/接收
UDP编程
消息队列
调用Put()和Get(),使用“包”对象,处理其包含的内容
消息被封装成语言可用的对象或结构
对某队列,存入一个消息,取出一个消息
ActiveMQ
流过滤
读取一个流,或写出一个流,对流中的单元包即刻处理
单元长度很小的统一数据结构
连接;发送/接收;处理
网络视频
资源拉取
输入一个资源ID,获得资源内容
请求或响应都包含:头部+正文
请求后等待响应
WWW
针对远程调用的特点,调用函数。业界在各种语言下都开发过类似的方案,同时也有些方案是试图做到跨语言的。尽管远程调用在编程方式上,看起来似乎是最简单易用的,但是也有明显的缺点,所以了解清楚远程调用的优势和缺点,是决定是否要开发,或者使用远程调用这种模型的关键问题。
远程调用的优势有:
-
<李>
屏蔽了网络层。因此在传输协议和编码协议上,我们可以选择不同的方案。比如网络服务方案就是用的HTTP传输协议+肥皂编码协议,而其他的方案往往使用HTTP + JSON协议.Facebook的节俭甚至可以定制任何不同的传输协议和编码协议,你可以用TCP +谷歌协议缓冲区,也可以用UDP + JSON……。由于屏蔽了网络层,你可以根据实际需要来独立的优化网络部分,而无需涉及业务逻辑的处理代码,这对于需要在各种网络环境下运行的程序来说,非常有价值。
李