这是我参加「第五届青训营 」伴学笔记创作活动的第 12 天。今天主要记录RPC框架的基本概念的相关知识。
重点内容
RPC框架的基本概念
主要知识点
RPC即Remote Procedure Calls,即远程函数调用。我们可以通过与过去我们在学校学习中常用的本地函数调用进行对比理解这一概念。
1、本地函数调用
以下面的一段伪代码为例
func main() {
var a = 2
var b = 3
result := add(a,b)
return
}
func add(x, y int) {
z := x + y
return z
}
在本地函数调用中,函数是存在于运行主程序的机器中的,因此其具体调用流程如下:
- 将实际参数a,b压入栈
- 通过函数指针跳转到add函数所在地址,进入函数后进行两次pop弹出a,b的值,赋给形式参数x,y
- 执行x + y并赋值为z
- 将z的值压栈,通过return返回到主函数
- z出栈,主函数获取到z的值
本地函数调用的方式简单可靠,易于理解,但在实际应用中实现某项功能往往需要实现许多子功能,若这些子功能都以本地函数的方式进行调用,那么这项功能的主程序执行起来的效率会随着子功能的增多而降低。同时,一些功能进行功能拆分后,某些子功能是完全相同的,此时使用本地函数调用就产生的代码的冗余,并且函数与主程序需要用同一种语言编写,难以移植。
2、远程函数调用
同样以1中的代码为例,在远程函数调用体系中,add函数会被部署到其他服务器中,main函数通过请求的方式请求执行函数,以响应的方式获取返回值。其具体流程如下:
- main函数将a,b打包为一个请求,发送到add函数所在服务器
- add服务器接收并解析请求,从请求中获取a,b的值,进行运算
- add将运算结果z以响应的形式打回到main服务器
- main服务器获取并解析响应,取得a+b的值
远程函数调用解决了本地函数调用的效率问题与代码冗余问题,但也遇到了一些问题,例如main服务器如何识别出add函数所在的服务器,如何提升网络传输的效率等。
3、RPC的完整过程
为了解决远程函数调用问题,在一系列学者与工程师的研究下,RPC框架日趋成熟。而一次完整的RPC过程可以用下图表示
这之中涉及到一些概念
-
IDL文件:以中立的方式描述接口,使得不同平台的对象和不同语言编写的程序可以相互通信
-
生成代码:通过编译器将IDL文件转换为对应语言的静态库
-
编解码:从内存中表示数字节序列的转换称之为编码,反之为解码
-
通信协议:规范了数据在网络中的传输内容与格式。
-
网络传输:通常基于成熟的网络库进行TCP/UDP传输
4、RPC的优点
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更高
- 故障隔离,整体可靠性强
总结
今天主要对前几天所学的RPC的基本概念进行笔记记录,后面会继续补充RPC分层设计与相关关键参数的内容