RPC入门

什么是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框架还涉及服务发现、注册中心、配置中心、限流、负载均衡等。

参考文档

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • go rpc 入门 rpc(Romote Procedure Call,远程过程调用)。相对应的就是本地过程调用,...
    _AlphaBaby_阅读 6,104评论 0 0
  • RPC框架原理 Remote Procedure Call——远程过程调用 转载自:https://mp.weix...
    刘敏_15da阅读 2,615评论 0 0
  • 前言 RPC到底是什么?gRPC又是什么》与HTTP直接存在什么关系? 本文将讨论一下RPC相关的概念并以Pyth...
    Java天天阅读 3,833评论 0 0
  • 背景 最近几天准备学习thrift,百度百科解释: Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和...
    愤怒的老照阅读 3,899评论 0 1
  • RPC 什么是RPC RPC全称Remote Procedure Call,即远程过程调用。要理解RPC,首先要...
    Byrondo阅读 2,350评论 0 0

友情链接更多精彩内容