一、基本概念
1.1 本地函数调用
1.将a和b的值压栈。
2.通过函数指针找到calculate函数,进入函数去除栈中的值2和3,将其赋予x和y。
3.计算x*y,并将结果保存在z
4.将z的值压栈,然后从calculate返回。
5.从栈中取出z返回值,并且赋值给result。
1.2 远程函数调用(RPC - Remote Procedure Calls)
RPC需要解决的问题:
- 函数映射
- 将数据转换成字节流
- 网络传输
1.3 一次 RPC的完整调用过程
- IDL文件:IDL通过一种中立的方式来描述接口,使得在不同的平台上运行的对象和用不同的语言编写的程序可以相互通信。
- 生成代码:通过编译工具把IDL文件转换成语言对应的静态库。
- 编解码:从内存中表示到字节库序列的转换称为编码,反之为解码,也叫做序列化和反序列化。
- 通信协议:规范了数据在网络中的 传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
- 网络传输:通常基于成熟的网络库走TCP/UDP传输。
二、分层设计
- 编解码层
- 协议层
- 网络通信层
三、RPC的稳定性 - 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路。
- 限流:保护被调用方,防止大流量把服务压垮。
- 超时控制:避免浪费资源在不可用节点上。