目录

RPC框架基本概念

前言

我们学到了RPC框架的各种概念,和RPC各层的设计等等。让我们再重新总结一下RPC框架的各种概率,进一步的理解各层原理。以便以后更好的使用。

RPC框架基本概念

本地调用和远程调用

本地调用就是在本机上进行函数调用,函数输入到输出都是在本地调用。

RPC,即远程函数调用(Remote Procedure Calls),即将函数的调用从本机放到远程的其他服务器上。

RPC需要解决以下这些问题:

  1. 函数映射:什么是函数映射?在本地调用中,函数体是通过函数指针来进行指向调用。是编译器在编译时确定好的。但函数指针在远程调用中是不可行的,因为远程调用所处的两端是处于不同的进程,地址空间完全不一样。所以为了解决这个问题我们需要建立一个映射表。每个函数分配一个ID,在RPC时附上这个ID,查找映射表就找到对应的函数并执行了。

  2. 数据转换成字节流:在本地调用中,只需要将参数直接压在栈中,让函数自行读取就好。在RPC过程中,客户端要将函数的参数值和要调用的函数ID传给服务端。不同进程之间是无法共享内存的。需要客户端将参数转换为字节流,传到服务端后以某种协议转换为可读的参数。

  3. 网络传输:本地调用只需要直接在本机上通过内存找到函数即可调用;但这RPC中,所有都需要经过网络来传输,包括参数、函数ID、返回。网络传输也带来许多问题,包括网络协议、延迟、丢包、安全性等等。

RPC概念模型

1984年 Nelson 发表了论文《Implementing Remote Procedure Calls》,在论文中提到了RPC的过程由5个模型组成:

  1. User
  2. User-Stub
  3. RPC-Runtime
  4. Server-Stub
  5. Server

一次RPC完整过程

  1. IDL(Interface description language)文件:IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。
  2. 生成代码:通过编译器工具把IDL文件转换成语言对应的静态库。
  3. 编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化。
  4. 通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
  5. 网络传输:通常基于成熟的网络库走TCP/UDP传输。

RPC的好处

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

RPC带来的问题

  1. 服务宕机,对方应该如何处理
  2. 在调用过程中发生网络异常,如何保证消息的可达性
  3. 请求量突增导致服务无法及时处理

而RPC框架的作用就是为我们处理这些RPC框架带来的问题,将解决方案集成在框架内,让我们专注于业务开发。

分层设计

RPC框架分为三层:编解码层、协议层、网络通信层

编解码层

  1. 生成代码:将客户端或服务器端的IDL文件转换成不同语言的库文件代码,其中封装了编解码逻辑。
  2. 数据格式:编解码层会使用各种数据格式来进行编解码和序列化反序列化。
  3. 选型: 对兼容性、通用性、性能等各方面按照业务要求进行特定选型。

协议层

协议层是作为网络通信的约定。进行网络通信的双方需要确定互相的交流语义。只有通过特定协议进行交流,双方才能够理解。

一般有两种包体协议:

  1. 特殊结束符
  2. 边长协议

然后通过网络通信层接收包后,根据特定的协议对包信息进行解析。解析完就传输到编码层。

网络通信层

  • 提供易用的API

    • 对Socket API 进行二次封装
    • 连接管理和事件分发
  • 功能

    • 支持多种协议:tcp、udp、uds等等
    • 更优雅的异常退出、异常处理等等
  • 性能

    • 应用层API使用buffer减少内存拷贝开销
    • 自带高性能定时器对象池等等

总结

这就是RPC框架的基本概念和分层结构,但是想要学习更多东西还是要动手。在实践中干啥RPC框架给业务开发带来的便利。