RPC学习 | 青训营
RPC(Remote Procedure Calls)基本概念
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的值压栈
- 通过函数指针找到调用的函数
- 进入函数取出栈中值,并赋予x,y
- 计算x * y,并将结果保存在z
- 将z的值压入栈,然后从函数中返回
- 从栈中取出z的返回值,并赋值给relust
RPC需要解决的三个问题:
- 函数映射——函数id
- 数据转换成字节流
- 网络传输
RPC远程函数调用5个模型:
- User
- User-stub
- RPC-runtime
- Server-stub
- server
流程图
RPC远程函数调用流程:
- user模块发起本地调用
- 调用user-stub将参数打包
- 打包完以后交给RPC-runtime,然后RPC-runtime把数据传给对端的RPC-runtime
- 对端RPC-runtime接收到数据会交给server-stub进行数据解压
- 解压完以后调用server,处理完之后返回
- 返回也是要先打包,然后网络传输,然后解压,再接受
RPC基本概念:
- IDL文件:一种中立的方式描述接口,使得不同平台运行的对象和用不同语言编写的程序可以互通
- 生成代码:通过编译器将IDL文件转换语言对应的静态库
- 编码解码:内存表示转换为字节序列为编码,字节序列转换为内存表示为解码
- 通信协议:规定了数据在网络传输中的内容与格式,除了必须的请求和响应数据,通常还要有额外的元数据
- 网络传输:TCP/UDP协议
RPC好处:
- 单一职责:利用维护和协作
- 可扩展性强,资源利用率高
- 障碍隔离,服务可靠性强
Thrift分层模型
Thrift模型
- code——用户自己编写的代码
- service.client/processor——通过代码生成工具把IDL文件转换成对应的lib代码,封装了编解码逻辑
- read/write——同上
- Tprotocal——编解码层
- TTransport——协议层
- Network IO——网络通信层