深入浅出RPC框架(一) | 青训营笔记

190 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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
}
  1. 将a和b的值压栈
  2. 通过函数指针找到calculate函数,进入函数取出栈中的值2和3,将其赋予x和y
  3. 计算x + y,并将结果存在z中
  4. 将z的值压栈,然后从calculate返回
  5. 从栈中取出z返回值,并赋值给result

远程函数调用(RPC-Remote Produce Calls)

image.png RPC需要解决的问题

  1. 函数映射
  2. 数据转换成字节流
  3. 网络传输

在本地调用中,我们只需要将参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。

RPC概念模型

image.png

一次 RPC 的完整过程

image.png IDL(Interface description language)文件

IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和不同语言编写的程序可以通信

生成代码

通过编译工具把IDL文件转换成语言对应的静态库

编解码

从内存中表示到字节序列的转换称为编码,反之为解码,也叫序列化和反序列化

通信协议

规范了数据在网络中的传输内容和格式,除必须的请求/响应数据之外,通常还会包含额外的元数据

网络传输

通常基于成熟的网络库走 TCP/UDP 传输

RPC 的好处

  1. 单一职责,有利于分工协作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高