RPC,Remote Procedure Call,远程过程调用。
那么怎么去理解这个远程过程调用呢?咱们能够先理解一下相对的本地过程调用。html
本地调用,很简单,通俗一点来讲,就是你在你的项目中定义了一个函数,而后调用,这就是本地过程调用。浏览器
function add(x, y){ return x + y; } const a = 1, b = 2; const result = add(a, b) // 这就是本地过程调用
如上面代码所示,先是定义了一个add
函数,在代码块最后一行调用add
函数的过程其实就是本地过程调用。
那么最后一行代码的执行,在计算机中的过程是怎样的呢?性能优化
result
ps:这只是简单描述了一下本地调用的过程,其实计算机内部或者浏览器V8引擎作了许多优化。网络
那么上面讲了本地过程调用,远程过程调用实际上是类似的,只是函数声明定义及其做用域在远端,别的机器,别的服务上,由于不存在共同的内存空间,因此不能够直接像本地调用同样寻找到该函数。框架
那么,对比本地调用,远程调用还须要额外解决什么问题呢?tcp
相对于本地调用来讲,不一样服务和不一样机器没法共用一样的内存空间,所以没法直接通信。所以须要创建TCP链接,调用方和被调方的数据均是基于此链接中进行交换。像grpc的框架,底层tcp链接是基于http2.0协议的,其中的协议数据类型有unary
和stream
两种,其中差别是客户端和服务端的通信差别,底层仍是经过二进制流拼凑的数据帧进行传输,而且在包头中会代表对应的数据类型。函数
基于第一步,两台机器中已经创建链接了,那么被调方怎么知道调用方想调用哪一个服务的哪一个接口呢?这里就须要在创建tcp链接进行数据传输的时候,须要调用方把被调方的ip、端口和函数id等信息带过去,这部分信息通常称为call ID映射。
通常来讲,调用方和被调方都会维护一个映射表,里面包含了调用函数的入参和出参,这部分有点相似与接口协议。性能
基于网络协议传输是二进制的形式,那么调用方传输的寻址信息和入参等数据须要序列化以后才能传输,而被调方先是反序列化数据,找到对应的函数,并在执行函数后将结果序列化后传回去给到调用方,最后调用方反序列化数据以后获得结果。
图片来源(https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)优化
相信不少同窗都有疑问,为啥要用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