RPC入门

作者: 淡季的风 | 来源:发表于2021-05-18 23:00 被阅读0次

什么是RPC?

RPC(Remote Procedure Call)- 远程过程调用。它是一种通过网络从远程计算机上请求服务, 而不需要了解底层网络协议的技术。也就是说两台服务器A和B, 一个部署在A服务器上, 想要调用部署在B服务器上的某个服务的某个方法, 由于不再同一个内存空间, 所以不能直接调用,需要通过网络来表达调用的语义和传输调用的数据。

RPC协议假定某些传输协议的存在, 如TCP或UDP, 为通信程序之间携带传输数据。在OSI网络通信模型中, RPC协议跨越了传输层和应用层。RPC使得开发网络分布式多程序在内的应用程序更加方便。 现在业界有很多优秀的RPC框架,如Spring Cloud, Dubbo, Thrift等。

RPC起源

RPC这个概念术语起源于上个世纪80年代,由Bruce Jay Nelson提出。这里我们追溯一下, 当时开发RPC的原动机是什么?在Nelson的论文“Implementing Remote Procedure Calls”中他提到 以下几点:

  • 简单: RPC概念的语义十分清晰和简单, 这样建立分布式计算程序就更容易。
  • 高效: 过程调用看起来非常简单和高效。
  • 通用: 在单机计算中过程往往是不同算法部分间最重要的通信机制。

通俗一点说, 就是大多数程序员对于本地调用很熟悉, 那我们吧RPC做成和本地调用完全类似, 就很容易被接受, 使用起来毫无障碍。

RPC结构

Nelson的论文指出实现RPC的程序包括5个部分:

  1. User
  2. User-stub
  3. RPCRuntime
  4. Server-stub
  5. Server
image.png

这里的user是client端, user想发起一个远程调用时, 实际时通过本地调用user-stub。user-stub负责将调用的接口、方法和参数通过约定的协议进行编码并通过本地的RPCRuntime传输给远端的实例。 远端RPCRuntime收到请求后交给server-stub进行解码后, 发起本地端调用, 调用结果再返回给user端。

以上是粗粒度的RPC实现概念结构, 接下来我们进一步细化它应该由哪些结构组成, 如下图所示:

image.png

RPC服务方通过RpcServer去导出(export)远程接口方法, 而客户端通过RpcClient去导入(import)远程接口方法。

RPC客户端像调用本地接口方法一样去调用远程接口方法, RPC框架提供接口的代理实现,实际的调用将委托给代理RpcProxy。代理封装调用信息并将调用转交给RpcInvoker去实际执行。在客户端的RpcInvoker通过连接器RpcConnector去维持与服务端的通道RpcChannel, 并使用RpcProtocol执行协议编码(encode)并将编码后的请求消息同通过通道发送给服务方。

RPC服务端接收器RpcAcceptor接收客户端的调用请求,同样使用RpcProtocol执行协议解码(decode)。解码后的调用信息传递给RpcProcessor去控制处理调用过程,最后再委托给RpcInvoker去实际执行并返回调用结果。如下时各个部分的详细职责:

1. RpcServer
    负责导出(export)接口

2. RpcClient
   负责导入(import)接口

3. RpcProxy
    负责Rpc的代理实现

4. RpcInvoker
    客户方实现: 负责编码调用信息和发送调用请求至服务方并等待调用结果返回。
    服务方实现: 负责调用服务方具体的实现接口并返回调用结果

5. RpcProtocol
   负责协议编码/解码

6. RpcConnector
   负责维护客户端和服务端的连接通道并将数据发送服务方

7.RpcAcceptor
   负责接收客户端请求并返回调用结果

8. RpcProcessor
   负责在服务方控制调用过程, 包括管理调用线程池、超时时间等

9. RpcChannel
   数据传输通道

RPC工作原理

RPC的设计由Client、 Client stub、Network、Server、Server stub等构成。 其中Client就是用来调用服务的, Client stub是用来把调用的方法和参数进行序列化的(pack/unpack), Network负责再网络中传输调用信息和返回结果, Server stub负责反序列化, Server就是服务的提供者,最终调用的就是Server实现的方法。

image.png

1、Client像调用本地方法一样调用远程方法
2、Client stub 封装调用信息,并进行序列化
3、客户端通过sockets将序列化后消息发送给服务方
4、服务端通过sockets接收消息
5、 Server stub将消息反序列化
6、 Server stub将消息解码并调用本地服务
7、本地服务执行并将结果返回给Server stub
8、Server stub将返回结果封装并序列化
9、服务端通过sockets发送序列化后结果
10、客户端接收消息并交给Client stub反序列化和解码
11、客户端得到最终结果

RPC调用分为2种:
1、 同步调用: 客户方等待调用执行完成并返回调用结果
2、 异步调用: 客户方调用完成后不用等待调用结果返回, 但客户方可以通过回调通知等方式获取返回结果。如果客户方不关系调用结果,则会变成单向调用。

RPC能干什么

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制,让使用者不必显式的区分本地调用和远程调用,在之前给出的一种实现结构,基于 stub 的结构来实现。下面我们将具体细化 stub 结构的实现。

  • 可以做到分布式,现代化的微服务
  • 部署灵活
  • 解耦服务
  • 扩展性强

RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。

总结

本文讲述一些RPC基本原理, 一个成熟的RPC框架还涉及服务发现、注册中心、配置中心、限流、负载均衡等。

参考文档

相关文章

  • go rpc 入门

    go rpc 入门 rpc(Romote Procedure Call,远程过程调用)。相对应的就是本地过程调用,...

  • RPC入门

    RPC入门 1. PRC简介 远程过程调用,Remote Procedure Call。它是一种通过网络向远程计算...

  • RPC - 入门

    本文的示例代码参考rpc-hprose 目录 HTTPServerClientPackage TCPServerC...

  • RPC入门

    RPC框架原理 Remote Procedure Call——远程过程调用 转载自:https://mp.weix...

  • RPC入门

    什么是RPC? RPC(Remote Procedure Call)- 远程过程调用。它是一种通过网络从远程计算机...

  • RPC入门介绍

    RPC 什么是RPC RPC全称Remote Procedure Call,即远程过程调用。要理解RPC,首先要...

  • RPC入门理解

    背景 最近几天准备学习thrift,百度百科解释: Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和...

  • Java自带RPC实现,RMI框架入门

    Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特...

  • 记一次python XML-RPC简单学习

    小白刚入门,如有不足之处请多指教。谢谢! 今天简单记录一下XML-RPC 的学习过程。 1.什么是XML-RPC?...

  • 想开发IM集群?先搞懂什么是RPC!

    本文引用了后端技术指南针公众号“浅谈RPC那些事儿1”和即时通讯网的“即时通讯新手入门:快速理解RPC技术——基本...

网友评论

      本文标题:RPC入门

      本文链接:https://www.haomeiwen.com/subject/wfrrjltx.html