这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
基本概念
本地函数调用
如图示就是本地函数调用的过程
- 将 a、b 压栈。
- 根据函数指针找到 calculate 函数。
- 从栈中取出 a、b,赋值给 x、y 参数。
- 将 z 的值压栈,从 calculate 函数返回
- 从栈中取出 z 的值,赋值给 result。
远程函数调用
简介
如图,网上商城服务调用支付服务,两个服务位于不同机器上,中间经过网络传输。
遇到的问题
- 函数映射
- 不同服务间属于不同进程,原来通过函数指针直接在内存中调用的方法失效,怎么确定调用的函数是自己想要调用的函数。
- 给服务上的函数做唯一标识,并在调用时识别。
- 数据转换为字节流
- 不同服务间属于不同进程,地址空间都不一致,不能直接传参,那要怎么传参呢?
- 通过将数据转化为字节流在网络中传输,收到后在转化为数据。
- 网络传输
- 远程函数调用需要经过网络,怎么保证网络传输质量。
概念模型
理论过程
- Caller machine 中 user 本地调用 User-stub,将数据封装成包
- RPCRuntime 发送包到 Callee machine
- Callee 中 RPCRuntime 接收到包
- RPCRuntime 本地调用 Server-stub 进行拆包
- Server-stub 将拆包后的数据交给 Server 调用本地函数 work (实际被调用者)
- Server 调用Server-stub,将执行结果打包。
- Server-stub 本地调用 RPCRuntime,RPCRuntime 将包通过网络发送给 Caller machine
- Caller machine 接收到包
- Caller machine 本地调用 User-stub,User-stub 将数据拆包
- User-stub 将拆包后的数据发送给 User (实际调用者)。
基本概念
IDL
简介
由于远程调用双方属于不同进程,调用方不知道被调用方有哪些方法、方法有哪些参数,所以需要被调用方主动暴露自己有哪些方法以及方法参数。
而 IDL文件,就是被调用方声明自己有哪些方法,方法有哪些参数的描述文件。
生成代码
简介
通过编译器工具,可以将 IDL 文件转化为语言对应的静态库,从而直接被依赖。
编解码 (序列化、反序列化)
从内存中表示 --》 字节序列 编码
反之,就是解码。
RPC 完整过程
实际过程
- Caller 将 Callee 的 IDL 生成代码
- 将数据编码为字节流
- 通过通信协议在合适的时机发送给 Callee
- Callee 端通过网卡等进行接收
- Callee 方将数据解码
- 数据交给Callee进行处理
RPC 好处
主要就是可以实现微服务。
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,每个服务可以自主扩缩容,资源利用率高,且服务可以复用。
- 故障隔离,整体可靠性高。
问题
- 被调用的服务宕机
- 网络异常
- 请求量突增,导致服务承载不了。