浅谈RPC

RPC

什么是RPC

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序像调用本地接口一样调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数并得到返回的结果,而不需要关心底层通信细节和调用过程。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC实现

  • RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

  • 运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:

    1. 调用客户端句柄;执行传送参数
    2. 调用本地系统内核发送网络消息
    3. 消息传送到远程主机
    4. 服务器句柄得到消息并取得参数
    5. 执行远程过程
    6. 执行的过程将结果返回服务器句柄
    7. 服务器句柄返回结果,调用远程系统内核
    8. 消息传回本地主机
    9. 客户句柄由内核接收消息
    10. 客户接收句柄返回的数据

      avatar

  • RPC包含传输协议和编码协议。在网络通信方面,RPC一般使用tcp作为传输协议,当然也可以使用http作为传输协议。从广泛来说,传统上的http接口调用也可以称作是RPC的一种实现方式。而消息数据编码协议一般包括json(jsonrpc)、xml(xmlrpc)、protobuf(grpc)等序列化方法。

为什么要使用RPC

良好的RPC调用是面向服务的封装,针对服务的可用性和效率等都做了优化,相比于单纯的http调用,多了更多面向服务的高级特性。

RPC调用方式

  • 同步调用:客户端调用RPC接口后,必须等待服务端处理完毕并返回结果;
  • 异步调用:客户端调用RPC接口后,不必等待执行结果返回,但依然可以通过回调通知方式获取返回结果。若客户端不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

RPC应用场景

在一个由多个微服务构成的大系统中,某些关键服务间的调用应当在较短的时间内返回,而且各个微服务的专业化程度较高,同一个请求的关注者只有一个。这个时候就应该用RPC。

主流RPC框架

业界主流的RPC框架整体上分为三类:

  1. 支持多语言的RPC框架,比较成熟的有Google的grpc、Apache(FacebooK)的Thrift;

  2. 只支持特定语言的RPC框架,例如新浪微博的Motan;

  3. 支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是RPC框架,例如阿里的Dubbo。

随着微服务的发展,基于语言中立性原则构建微服务,逐渐成为一种主流模式。因此, 基于多语言的RPC框架来构建微服务,是一种比较好的技术选择。