baidu_std协议了解
转自:https://github.com/apache/incubator-brpc/blob/master/docs/cn/baidu_std.md
1.介绍
baidu_std是一种基于TCP协议的二进制RPC通信协议。它以Protobuf作为基本的数据交换格式,并基于Protobuf内置的RPC Service形式,规定了通信双方之间的数据交换协议,以实现完整的RPC调用。
方法由(ip,port,服务名,方法名)四元组标识, 调用方法所需参数应放在一个Protobuf消息内。如果方法有返回结果,也同样应放在一个Protobuf消息内。
2.包
包是baidu_std的基本数据交换单位,包分为请求包和响应包两种。
每个包由包头和包体组成,其中包体又分为元数据、数据、附件三部分。具体的参数和返回结果放在数据部分。
2.1 包头
包头长度固定为12字节。前四字节为协议标识PRPC,中间四字节是一个32位整数,表示包体长度(不包括包头的12字节),最后四字节是一个32位整数,表示包体中的元数据包长度。整数均采用网络字节序表示。
2.2 包体
元数据:
元数据用于描述请求/响应。
message RpcMeta { optional RpcRequestMeta request = 1;//请求包元数据 optional RpcResponseMeta response = 2;//响应包元数据 optional int32 compress_type = 3;//压缩算法 optional int64 correlation_id = 4;//请求包中的该域由请求方设置,用于唯一标识一个RPC请求。 optional int32 attachment_size = 5;//附件大小 optional ChunkInfo chuck_info = 6; optional bytes authentication_data = 7;//用于存放身份认证相关信息 };
请求包中只有request 1,响应包中只有response 2。实现可以根据域的存在性来区分请求包和响应包。(也就是说,request不为空说明就是请求包,response不为空就是响应包。)
请求包元数据主要描述了需要调用的RPC方法信息,包括service_name、
method_name、
log_id(用于打印日志)。
响应包的元数据是对返回结果的描述。包括error_code、
error_text。
数据:
自定义的Protobuf Message。用于存放参数或返回结果。
附件:
某些场景下需要通过RPC来传递二进制数据,例如文件上传下载,多媒体转码等等。将这些二进制数据打包在Protobuf内会增加不必要的内存拷贝。因此协议允许使用附件的方式直接传送二进制数据。
附件总是放在包体的最后,紧跟数据部分。消息包需要携带附件时,应将RpcMeta中的attachment_size设为附件的实际字节数。
【还不太理解附件具体怎么用】