一、什么是协议

在网络交互中,它以二进制格式的字节流的形式传输。因此,我们面临着如何将字节流转换为我们可以识别的字符的问题。协议用于解决这个问题。协议可以很容易地解释为通信方需要遵守的协议。在日常开发中,我们常见的网络传输协议是TCP、UDP和HTTP。通用中间件也会定义相应的协议,如Redis、MySQL、Zookeeper等,它们都有自己的协议。类似地,Dubbo也使用协议进行通信。这些是基于TCP或UDP设计的应用层协议。

二、如何定义协议

应用层协议有三种通用形式:固定长度协议、特殊终止协议和可变长度协议。这里可以问一个常见的面试问题。如何解决网络通信中的数据包粘贴和解包问题?解决这个问题的办法是就协议达成一致。我们来谈谈这三种模式的优缺点及其使用场景。

三、定长协议

固定长度协议意味着协议内容的长度是固定的。例如,协议字节长度为50。当从网络读取50个字节时,执行解码操作。

优点

定长协议在读取或者写入时,效率比较高,因为数据大小都是确定的。

缺点

固定长度协议的缺点是适应性不足。网络传输中传输的内容大小不能相同。因此,对于一些长度不足的消息,带宽显然被浪费了太多。

特殊结束符

特殊终止符是在每次传输结束时使用的特殊终止符。Redis中的协议使用特殊的终止符。客户端和服务器发送的命令都使用r n(CRLF)终止符。

优点

与定长协议一样读取或者写入时,效率比较高,同时解决定长协议的尴尬。

缺点

特殊终止符模式的问题是必须有完整的消息体可供传输。此外,有必要防止用户传输的数据与终止符相同,否则会出现混乱。

变长协议

可变长度协议由两部分组成:固定长度和可变长度。固定长度部分通常是协议头,该部分将包含可变长度部分的描述。我们经常使用的可变长度协议是可变长度协议。HTTP请求消息格式由三部分组成:

请求行:包括Url、Version等,用空格分隔,结尾为r;

请求标头:多行。每行的格式为key:value,以r n结尾;

请求体:请求头和请求体直接用空行分隔,请求体的长度由请求头中的内容长度给出;

优点

灵活性比较高,解决了定长协议以及特殊结束符的所有缺点。

缺点

复杂性比较高,需要自定义一套标准,所有消息都需要按照该格式发送以及解析。

四、Dubbo协议

Dubbo框架支持许多协议。默认情况下,使用Dubbo协议。Dubbo协议被设计为可变长度协议。总体格式如下:

位0~7和位8~15分别为魔法高和魔法低,它们是固定的魔法值(0xdabb)。我们可以通过这两个字节来判断它们是否是Dubbo协议;

16位Req/Res标识符用于识别当前消息是请求还是响应;

17位是2Way标识符,用于标识当前消息是单向还是双向。如果需要来自服务器的返回值,则将其设置为1;

18位是事件标识符,用于标识当前消息是否为事件消息;

位19~23是串行化类型标志,用于标识当前消息使用哪种串行化算法;

24~31位为状态,用于记录响应状态。仅当Req/Res为0时才有用;

32~95位为请求ID,用于记录请求的唯一标识;

96-127位是串行化内容长度,以字节计算;

128位之后是可变数据。在通过特定的序列化类型进行序列化之后,每个部分都是一个字节[]或一个字节。如果是请求包,则每个部分是:Dubbo版本、服务名称、服务版本、方法名称、方法参数类型、方法参数和附件。如果是响应包,则每个部分是:返回值类型,返回值;

image.png

优点

Dubbo协议的总体设计相对简单。它可以用一位表示,而不是一个字节;此外,请求头与响应头一致,可以作为一个整体使用一组解析标准。代码实现相对简单。

缺点

由于整体的设计相对简洁,导致扩展性不够;

五、Dubbo协议是如何解析的

  1. 在通信部分,我们讨论了Codec2接口,它提供编码和解码方法,以实现消息和字节流之间的相互转换。我们没有解释这个接口的实现,但在这里我们将看到这个部分与Dubbo协议有什么关系。

子类的几个基本方法。

GetSerialization方法:通过SPI获取当前的序列化方法;

CheckPayload方法:检查编码和解码数据的长度。如果数据太长,将引发异常;

IsClientSide和isServerSide方法:判断客户端或服务器端是当前的;

接下来,让我们讨论如何解析子类。我们可以看到四个子类的继承关系,重点是ExchangeCodec和DubboCodec,并简要介绍其他子类。TransportCodec此类已标记为已弃用。在此类中,根据getSerialization方法选择的序列化方法序列化或反序列化传入消息或ChannelBuffer。TelnetCodec继承了TransportCodec的功能。此类主要提供处理Telnet命令的能力。此功能主要用于管理服务。我们稍后将介绍它。

举报/反馈

黄琴影视说

33获赞 85粉丝
每天分享一些有趣的事情
关注
0
0
收藏
分享