RPC学习 | 青训营

56 阅读2分钟

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——网络通信层