RPC原理与实现 | 青训营笔记

117 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

基本概念

本地函数调用

image.png

如图示就是本地函数调用的过程

  1. 将 a、b 压栈。
  2. 根据函数指针找到 calculate 函数。
  3. 从栈中取出 a、b,赋值给 x、y 参数。
  4. 将 z 的值压栈,从 calculate 函数返回
  5. 从栈中取出 z 的值,赋值给 result。

远程函数调用

简介

image.png

如图,网上商城服务调用支付服务,两个服务位于不同机器上,中间经过网络传输。

遇到的问题

  • 函数映射
    • 不同服务间属于不同进程,原来通过函数指针直接在内存中调用的方法失效,怎么确定调用的函数是自己想要调用的函数。
    • 给服务上的函数做唯一标识,并在调用时识别。
  • 数据转换为字节流
    • 不同服务间属于不同进程,地址空间都不一致,不能直接传参,那要怎么传参呢?
    • 通过将数据转化为字节流在网络中传输,收到后在转化为数据。
  • 网络传输
    • 远程函数调用需要经过网络,怎么保证网络传输质量。

概念模型

image.png

理论过程

  1. Caller machine 中 user 本地调用 User-stub,将数据封装成包
  2. RPCRuntime 发送包到 Callee machine
  3. Callee 中 RPCRuntime 接收到包
  4. RPCRuntime 本地调用 Server-stub 进行拆包
  5. Server-stub 将拆包后的数据交给 Server 调用本地函数 work (实际被调用者)
  6. Server 调用Server-stub,将执行结果打包。
  7. Server-stub 本地调用 RPCRuntime,RPCRuntime 将包通过网络发送给 Caller machine
  8. Caller machine 接收到包
  9. Caller machine 本地调用 User-stub,User-stub 将数据拆包
  10. User-stub 将拆包后的数据发送给 User (实际调用者)。

基本概念

IDL

简介

由于远程调用双方属于不同进程,调用方不知道被调用方有哪些方法、方法有哪些参数,所以需要被调用方主动暴露自己有哪些方法以及方法参数。

而 IDL文件,就是被调用方声明自己有哪些方法,方法有哪些参数的描述文件。

生成代码

简介

通过编译器工具,可以将 IDL 文件转化为语言对应的静态库,从而直接被依赖。

编解码 (序列化、反序列化)

从内存中表示 --》 字节序列 编码

反之,就是解码。

RPC 完整过程

image.png

实际过程

  1. Caller 将 Callee 的 IDL 生成代码
  2. 将数据编码为字节流
  3. 通过通信协议在合适的时机发送给 Callee
  4. Callee 端通过网卡等进行接收
  5. Callee 方将数据解码
  6. 数据交给Callee进行处理

RPC 好处

image.png

主要就是可以实现微服务。

  • 单一职责,有利于分工协作和运维开发
  • 可扩展性强,每个服务可以自主扩缩容,资源利用率高,且服务可以复用。
  • 故障隔离,整体可靠性高。

问题

  • 被调用的服务宕机
  • 网络异常
  • 请求量突增,导致服务承载不了。