什么是RPC

RPC(Remote Procedure Call Protocol),远程过程调用协议,网络上的一台计算机可以通过该协议调用另外一台计算机上提供的服务或方法,它是进程间通信(IPC)的一种方式。

为什么要有RPC

RPC 是SOA以及现在分布式系统的基石,分布式架构下,服务分布在不同的机器上,他们之间就需要某种方式来通信,RPC正是解决这个问题的,它承担了分布式系统中服务间的通信重任。

RPC设计思路

RPC通俗来讲,就是要解决机器A怎么调用到机器B上方法的问题,因此可以设计为客户端/服务端架构。
既然是客户端/服务端架构,HTTP服务是一个现成的解决方案,将服务发布成HTTP接口就好了。这也是WebService技术的基本思路:将服务包装成XML格式文件,然后通过HTTP接口暴露出来,供客户端调用。

HTTP技术简单易实现,但性能不高,在高性能要求场景下就有点吃力了。这时,可以基于传输层的TCP/UDP协议来自定义一个高效RPC框架。
从架构视角上来看,框架包含如下几个部分:

  • User:客户端,它需要尽可能少的知道RPC细节,对它来说,调用一个RPC方法跟调用本地的一个方法不会有太多区别
  • User-stub:这是客户端打包/拆包层,将客户端的调用请求按照协议格式打包好,并将包传给下一层,发送给服务端;服务端返回消息后,该层负责将消息拆解返回给客户端
  • RPCRuntime:数据传输层的简单包装,一般走TCP协议
  • Server-stub:与User-stub功能类似,用于打包/拆包服务端的数据
  • Server:服务端

RPC概述 - 图1

RPC框架需要解决的核心问题

从上面分析来看,一个RPC框架需要解决的核心问题如下:

  • 服务暴露: 服务端如何将自身的能力告知客户端,目前较常用的方式是通过IDL(Interface Definition Language)来定义远程接口,客户端通过框架根据IDL生成Stub端代码
  • 远程对象的代理:从客户端视角来看,它应该持有一个服务端的代理对象,通过该对象来调用到服务端服务。
  • 通信:数据如何通信,根据上述分析可以有HTTP、TCP、UDP等途径,此外还要考虑如下问题:
    • 消息ID
    • 心跳
    • IO方式及连接数
  • 序列化:数据如何转换为二进制格式供网络传输。 就序列化而言,Java 提供了默认的序列化方式,但在高并发的情况下,这种方式将会带来一些性能上的瓶颈,于是市面上出现了一系列优秀的序列化框架,比如Protobuf、Kryo、Hessian、Jackson 等,它们可以取代 Java 默认的序列化,从而提供更高效的性能

有哪些常用的RPC框架

Java领域常用的有:

  • Dubbo
  • Spring Cloud
  • Thrift

参考资料