什么是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个部分:
- User
- User-stub
- RPCRuntime
- Server-stub
- Server
这里的user是client端, user想发起一个远程调用时, 实际时通过本地调用user-stub。user-stub负责将调用的接口、方法和参数通过约定的协议进行编码并通过本地的RPCRuntime传输给远端的实例。 远端RPCRuntime收到请求后交给server-stub进行解码后, 发起本地端调用, 调用结果再返回给user端。
以上是粗粒度的RPC实现概念结构, 接下来我们进一步细化它应该由哪些结构组成, 如下图所示:
image.pngRPC服务方通过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.png1、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框架还涉及服务发现、注册中心、配置中心、限流、负载均衡等。
网友评论