RPC-远程过程调用

RPC-远程过程调用

什么是RPC

RPC,Remote Procedure Call,远程过程调用。
那么怎么去理解这个远程过程调用呢?咱们能够先理解一下相对的本地过程调用。html

本地过程调用

本地调用,很简单,通俗一点来讲,就是你在你的项目中定义了一个函数,而后调用,这就是本地过程调用。浏览器

function add(x, y){
    return x + y;
}

const a = 1, b = 2;
const result = add(a, b) // 这就是本地过程调用

如上面代码所示,先是定义了一个add函数,在代码块最后一行调用add函数的过程其实就是本地过程调用。
那么最后一行代码的执行,在计算机中的过程是怎样的呢?性能优化

  1. 计算机解析函数名
  2. 经过最底层的块级做用域一直往上找寻找函数声明的地方
  3. 计算机寻址,从内存中找到存放该函数的地址
  4. 参数a和b入栈,执行函数逻辑
  5. 返回计算结果并赋值给result

ps:这只是简单描述了一下本地调用的过程,其实计算机内部或者浏览器V8引擎作了许多优化。网络

远程过程调用

那么上面讲了本地过程调用,远程过程调用实际上是类似的,只是函数声明定义及其做用域在远端,别的机器,别的服务上,由于不存在共同的内存空间,因此不能够直接像本地调用同样寻找到该函数。框架

那么,对比本地调用,远程调用还须要额外解决什么问题呢?tcp

1.通信问题

相对于本地调用来讲,不一样服务和不一样机器没法共用一样的内存空间,所以没法直接通信。所以须要创建TCP链接,调用方和被调方的数据均是基于此链接中进行交换。像grpc的框架,底层tcp链接是基于http2.0协议的,其中的协议数据类型有unarystream两种,其中差别是客户端和服务端的通信差别,底层仍是经过二进制流拼凑的数据帧进行传输,而且在包头中会代表对应的数据类型。函数

  1. unary,经过一问一答的形式在客户端和服务端中进行通信。
  2. stream,其中又分为客户端流、服务端流和双工流。
    ①客户端流:客户端发送多条数据流,服务端回答一条。
    ②服务端流:客户端发送一条数据流,服务端回答多条。
    ③双工流:客户端和服务端均可以主动向对方发送数据流。
2.寻址问题

基于第一步,两台机器中已经创建链接了,那么被调方怎么知道调用方想调用哪一个服务的哪一个接口呢?这里就须要在创建tcp链接进行数据传输的时候,须要调用方把被调方的ip、端口和函数id等信息带过去,这部分信息通常称为call ID映射。
通常来讲,调用方和被调方都会维护一个映射表,里面包含了调用函数的入参和出参,这部分有点相似与接口协议。性能

3.序列化和反序列化

基于网络协议传输是二进制的形式,那么调用方传输的寻址信息和入参等数据须要序列化以后才能传输,而被调方先是反序列化数据,找到对应的函数,并在执行函数后将结果序列化后传回去给到调用方,最后调用方反序列化数据以后获得结果。
image.png
图片来源(https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)优化

为何用RPC

相信不少同窗都有疑问,为啥要用RPC协议?为啥不能继续用http/https协议进行传输呢?
其实你们陷进了一个理解误区,就是RPC和``不是两个平行的概念。
RPC只是一个函数调用,可是须要经过远程调用,所以底层通信传输是基于TCP协议的。
HTTP协议是一个网络传输协议,底层也是基于TCP的,所以你们很容易产生误解。网络传输协议

那么为何要用RPC进行呢?

1.RPC协议,客户端和服务端都会维护一份结构和映射表,使调用和传输的数据更透明,双方均可以更严格地制约调用参数和回包参数的类型,从而减小bug。

2.对TCP传输进行优化,如:二进制流传输,无用包头信息废除,包体压缩,字节编码解码优化等。其实基于HTTP2.0这些功能已经支持了,所以gRPC的TCP传输也是参考HTTP2.0的。

3.rpc结构层能够作更多的监控,容错和性能优化。

参考文章:
https://www.zhihu.com/question/25536695
https://www.zhihu.com/question/41609070

相关文章
相关标签/搜索