RPC
原文链接:https://www.techtarget.com/searchapparchitecture/definition/Remote-Procedure-Call-RPC
什么是RPC?
rpc 是一个软件通信协议,用来 请求 在不同的计算机或网络上的服务,并且不需要担心中间的网络细节
具体而言 RPC 可以像调用本地进程一样调用远程系统上的进程.
rpc 类似一个低层传输协议,用于在通信程序之间传输数据包
rpc 是 client-server 模型,请求程序是client,提供服务的程序是 server.
rpc 和 本地调用程序一样,是一个同步操作,要求 发送请求方必须暂停,直到远程程序的结果返回.不过,共享同一地址空间的轻量级进程或线程可以同时运行多个rpc
IDL 被用于 RPC,IDL可以连接两个不同的操作系统的机器
RPC做了什么?
rpc常用于分布式系统.它可以让程序像调用本地的程序一样去调用远程的子程序.虽然说 rpc 类似于传输协议,但它实际上是一个进程间的通信程序
当使用 rpc 框架的程序语句或指令被编译成可执行文件,一个 stub(存根) 也在这个文件内.
存根是一段代码,用来转变 在 client 和 server 之间传递的参数,stub就好像远程程序代码的一个代表
当 client 程序运行,发出调用,这个 stub 收到这个请求并把它发送到 一个 client runtime program. 当第一次 client 方的 stub 被调用时,他会去接触一个 name server 来判断 server 所在的传输地址
这个client runtime program 知道怎么去定位 远程的计算机和 server 应用程序,然后发送消息,请求远程程序. 同样的,server 这边也有一个 远程程序自己的 runtime program 和 stub
响应请求协议和上面的步骤相同
RPC怎么工作的?
当发起远程程序调用时,发起调用的环境被阻塞.程序参数通过网络被发往到应该执行程序的设备上.随后,程序在那个环境开始执行
当程序完成后,数据将被返回至调用环境,然后程序接着执行,就好像是收到了一个正常调用的返回
以下是 一个 rpc 的执行步骤
- client 调用 client stub,这是一个本地调用,把参数压入栈
- client stub 把这些参数打包进一个message,然后发起系统调用.这个打包过程称之为编组
- client的本地操作系统把message从本地发送到远程设备
- server的操作系统传输层将传入的包发送给 server stub
- stub 从这些包里面取出参数,这一步称之为解组
- 当server的程序执行完毕后,把结果传给 server stub,stub再把返回值编组成message,然后把这个message 返回给传输层
- server 传输层发送message给client传输层,然后client传输层会将message发给 client stub
- client 通过解组,拿到返回的参数和调用执行结果
RPC 的种类
-
Synchronous 同步
client 发送请求并且等待 server 回复 -
Nonblocking 非阻塞
client 发送请求,但不等待回复,而是继续向下执行 -
Batch-Mode 批处理模式
client 在一组中发送多个 nonblocking 调用 -
Broadcast 广播
client 向多个 server 发送 message,并且接受所有的回复 -
Callback 回调
client 发送一个 nonblocking client-server 的调用
client-server通信方式有:消息队列、 IBM’s Advanced Program-to-Program Communication、REST
RPC的优缺点
优点:
- 帮助client 使用传统的程序调用和 server 通信
- 可以在本地或者分布式环境运行
- 支持面向进程和面向线程的模型
- 对用户隐藏了内部的消息传递机制,提供抽象
- 忽略了一些协议层来提升性能
缺点:
- client 和 server 为他们的例程使用了不同的运行环境,然后资源的使用更加复杂. 所以RPC不总是适合于海量数据的传输
- rpc 很容易失败,因为它包含了一个交流系统,另一台机器,另一个进程
- rpc 不如其他 API 灵活,比如 REST