Loading

你是如何理解RPC的?

RPC英文全程是Remote Procedure Call,中文全称叫做远程过程调用。我们遇到大多数都是本地调用,一种是同一个程序内调用,比如一个函数调用另外一个函数,第二种情况是一个进程调用另外一个进程算是跨进程调用。而RPC则是跨机器跨进程的调用,大概如下图所示:

其实本身也没什么好神奇的,下面我们从广义地角度简单说说这个玩意,当然也带有了我个人的一些主观色彩在内。

由于是跨机器的调用,所以,要面临的第一个问题就是通信以及通信协议。通信协议有很多,我们见过的有TCP、UDP、http甚至mqtt等等,当然几乎目前大多数协议都是基于TCP协议实现或者UDP协议实现的。以往,可能更多人都觉得RPC要通过TCP协议实现才行,但是时代发展进步,通过http协议也是完全没有问题的。如果是HTTP协议的话,使用起来会方便很多,因为http协议已经帮我们做好了协议数据格式,而且应用及其广阔,几乎所有的网络软件都支持http协议。但是tcp协议相对就负责很多,但是tcp协议相比http协议更加高效(因为http只不过是基于tcp协议实现的应用层协议而已),而且tcp可以支持长链接,这是http所无法比拟的。重点说下如果使用tcp协议当rpc服务的消息协议的需要注意的一点就是数据包拆包问题。由于tcp协议是流式的,也就是数据是没有边界的,所以数据的接收方比如要知道如何区别数据边界!不然数据就要混乱了!tcp数据拆包有两个方法:

  • 一是通过特殊结尾字符。比如\r\n等等,表示一旦数据中遇到\r\n这就是一个完整的数据包
  • 二是包头定长协议。这种情况一个数据包大概分两份,一个头部,一个消息体。其中头部中说明数据包多大,头部多大,通过这个数字来确定包有多大

然后是第二个问题,就是数据格式问题。一般是消息数据格式分为两大类:

    • 文本类
    • 二进制类
      文本类就是肉眼可见的消息,你可以自定义格式,也可以采取一个通用的格式,比如json,当然你也可以自己用一些自己定制的格式,不过还是建议大家采用国际通用的格式。
      二进制的消息就是将数据转成二进制流去发送,这种数据肉眼不太可见
      那么,这二者区别在于什么呢?在于文本类数据消息在编码以及解码的时候速度慢,而且编码过后数据的体积会大些;而二进制编码,解码更快,而且二进制数据体积相对会小很多,传输地会更快!

转:https://t.ti-node.com/

posted @ 2018-09-05 13:25  王召波  阅读(1283)  评论(0编辑  收藏  举报