RPC协议
RPC协议同HTTP协议一样,都是属于应用层的协议,可以通过学习HTTP的协议来理解RPC协议.
- HTTP的协议:请求行,请求头部,请求数据
协议的作用
在网络通信中,只有二进制才可以传输,所以RPC请求在发送到网络中之前,需要把方法调用的请求参数转成二进制,转成二进制后写入本地socket,然后被网卡发送到网络设备中去。但是在传输的过程中,RPC 并不会将请求参数的所有二进制数据整体一下发送到对端的机器上,中间会拆成好几个数据包,也可能会合并其他请求的数据包。所以在RPC传输的过程中,为了能够准确获取数据,我们在请求的发送数据包里会加入一个指定的协议,方便我们从中获取指定的数据。
如何设计协议
相比HTTP,RPC更多的是负责应用之间的通信,所以性能要求比较高,但是HTTP协议的数据包大小相对请求数据本身要大很多,又加入了很多无用的东西,而且HTTP协议属于无状态协议,客户端无法对请求和响应进行关联,每次请求都需要重新建立连接,响应完成后再关闭链接,因此RPC会选择设计更加紧凑的私有协议。
如何设计一个RPC的私有协议
在协议头里除了放会议长度,序列化方式,还会放一些协议标示,消息ID,消息类型等参数,而协议体一般只放请求接口方法,请求业务参数值和一些扩展属性,这样可以实现一个完整的RPC协议:协议头是由一堆固定长度的参数组成,而协议体是根据请求接口和参数构造的,长度属于可变的。
可扩展协议
设计一种支持可以扩展的协议,其关键在于让协议头支持可扩展,扩展后的协议头长度就不固定了,所有整个协议需要设计成:固定部分,协议头内容,协议体内容。