协议的作用
RPC请求在发送到网络中之前,需要把方法调用的请求参数转成二进制,然后写入本地的Socket,然后被网卡发送到网络设备中。
但是RPC请求不会把请求参数的所有二进制数据一下子筒体的发送到对端机器上,中间可能会拆分成好几个数据包,为了避免语义不一致的事情发生,所以在发送请求的时候设定一个边界,然后收到请求的时候按照这个设定的边界进行数据分割。这个边界语义的表达就是协议。
为什么不使用HTTP协议
HTTP协议和RPC协议同属应用层协议,那为什么不使用HTTP协议呢?
RPC的作用相对于HTTP协议,RPC协议负责应用间的通信,所以性能要求更高。HTTP协议的数据包大小相对请求数据本身要大很多,又需要加入很多如换行符回车符等无用的内容;并且HTTP协议属于无状态协议,客户端无法对请求和相应进行关联,每次请求都要重新建立连接,先应完成后关闭连接,因此HTTP协议不能很好的满足需求,所以RPC会选择设计更紧凑的私有协议。
设计一个可扩展的可向下兼容的协议
协议头和协议体模式。协议头包括序列化方式,协议长度,协议标示,消息ID,消息类型等参数,协议体中存放请求接口方法,请求的业务参数值和一些扩展属性。这种方式并不好扩展。这种方式扩展会使得协议头的长度不再固定。
所以在此基础上,为了实现读取不定长的协议头的内容,需要一个固定的部分写入协议头长度。这样协议就变成了三部分,固定部分,协议头,协议体。前两个部分还是可以统称为协议头。
总结
RPC协议要保证二进制数据经过网络传输后还能被正确的还原语义,避免调用方和被调用方不能通信。同时设计协议不仅要考虑满足当前功能,还要保证可以向下兼容能够很好的扩展,支持新增功能。