什么是RPC?

RPC的定义

维基百科对RPC的定义是:

在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。

如下图:

RPC的步骤

  1. 服务消费方(client)调用以本地调用方式调用服务;
  2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
  3. client stub找到服务地址,并将消息发送到服务端;
  4. server stub收到消息后进行解码;
  5. server stub根据解码结果调用本地的服务;
  6. 本地服务执行并将结果返回给server stub;
  7. server stub将返回结果打包成消息并发送至消费方;
  8. client stub接收到消息,并进行解码;
  9. 服务消费方得到最终结果。

RPC解决了什么问题?

让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。

RPC都有哪些框架?

开源框架:

  • Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。
  • gRPC :gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
  • Hessian: Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
  • Thrift: Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
    闭源框架:
  • HSF :HSF是阿里巴巴内部使用的框架,诞生于淘宝,比诞生于B2B团队的Dubbo要早个3年,目前在阿里内部已经是HSF的天下了。
  • Motan: 微博内部使用的rpc框架,底层支持java,生态圈往service mesh发展以支持多语言
  • Pigeon:Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一。和阿里的Dubbo类似,在微服务的场景下,提供高性能和透明得如同本地化调用的RPC调用服务。

RPC和HTTP的比较

其实两者没有没有什么可比较之处,只不过经常被人拿出来比较而已,RPC是远程过程调用,包含了传输协议和编码协议,只不过大部分RPC框架都用TCP/IP来当做传输协议,当然HTTP也可以被当做出传输协议,比如gRPC
大部分人其实想问的是为什么大部分RPC框架都用TCP/IP来当做传输协议?
可以思考一个问题:http和tcp之间的差异是什么?
学过网路的人都知道http是建立在tcp协议所在的传输层纸上的应用层的,而在应用层就会比传输层要多很多的头部信息
比如下图:发送一个请求到百度,可以看到HTTP/1.1协议的报文包含太多在传输过程中可能无用的信息:

使用自定义 TCP 协议进行传输就会避免上面这个问题,极大地减轻了传输数据的开销。 这也就是为什么通常会采用自定义 TCP 协议的 RPC 来进行进行服务调用的真正原因。
此外,成熟的 RPC 框架还提供了 服务自动注册与发现、负载均衡、服务治理、等等高级功能,这些就是后话了,我们下一次再唠。


本站由 Hank Zhao 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量