如何设计一个RPC系统?

  

  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……。由于屏蔽了网络层,你可以根据实际需要来独立的优化网络部分,而无需涉及业务逻辑的处理代码,这对于需要在各种网络环境下运行的程序来说,非常有价值。   李

    如何设计一个RPC系统?