如何设计可扩展且向后兼容的RPC协议
为什么不直接用现成的HTTP协议?
RPC的职责是负责应用间的通信,所以性能要求相对更高。而HTTP协议的数据包相对于请求数据本身要大很多,有很多冗余内容(如换行回车等),会影响性能。另外HTTP协议是无状态的协议,每次请求都要重新建立连接。因此对于要求高性能的RPC来说,HTTP协议很难满足要求。
怎样设计一个私有RPC协议?
最简单的协议数据格式
最简单的协议数据格式就是数据长度+数据体,接收方先读一个固定长度的值作为数据长度,然后根据这个长度继续读取对应长度的数据作为数据体。
改进的协议数据格式
使用数据长度+数据体方式只能用来断句,给接收的数据分段,并不能知道数据体中的数据是使用什么序列化方式。因此需要将序列化方式单独拿出来,类似数据长度那样用固定的长度存放,除了序列化方式之外还有其他的参数需要使用固定长度存放,把这些需要固定长度存放的参数统称为协议头。而数据体的长度是可变的。
在协议头中,除了放数据长度,序列化方式,还会放一些协议标识、消息ID、消息类型等参数,而协议体一般只放请求接口方法、请求的业务参数和一些扩展属性。
但是这样的协议还存在一个问题,不可扩展,因为协议头是定长的,如果后面想加入新的参数,就会导致兼容问题。
可扩展的协议
为了保证能平滑地升级改造已有地协议,需要设计一种可扩展地协议。其关键在于让协议头可扩展,也就是说协议头的长度不是固定的。那么就需要一个固定长度的值去获取协议头的长度。整个协议就分成三部分内容:固定部分、协议头内容、协议体内容。前两部分还是可以统称为协议头,具体的协议如下: