这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
今天整理了RPC框架的相关学习笔记。
基本概念
本地函数调用
func main(){
var a = 2
var b = 3
result := calculate(a,b)
fmt.Println(result)
return
}
func calculate(x,y int){
z := x + y
return z
}
- 将a和b的值压栈
- 通过函数指针找到calculate函数,进入函数取出栈中的值2和3,将其赋予x和y
- 计算x + y,并将结果存在z中
- 将z的值压栈,然后从calculate返回
- 从栈中取出z返回值,并赋值给result
远程函数调用(RPC-Remote Produce Calls)
RPC需要解决的问题
- 函数映射
- 数据转换成字节流
- 网络传输
在本地调用中,我们只需要将参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。
RPC概念模型
一次 RPC 的完整过程
IDL(Interface description language)文件
IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和不同语言编写的程序可以通信
生成代码
通过编译工具把IDL文件转换成语言对应的静态库
编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也叫序列化和反序列化
通信协议
规范了数据在网络中的传输内容和格式,除必须的请求/响应数据之外,通常还会包含额外的元数据
网络传输
通常基于成熟的网络库走 TCP/UDP 传输
RPC 的好处
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高