首页 > 其他分享 >baidu_std协议了解

baidu_std协议了解

时间:2022-11-05 20:46:11浏览次数:62  
标签:baidu std Protobuf 协议 RPC 附件 optional 包体 请求

转自: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设为附件的实际字节数。

【还不太理解附件具体怎么用】

标签:baidu,std,Protobuf,协议,RPC,附件,optional,包体,请求
From: https://www.cnblogs.com/BlueBlueSea/p/16861025.html

相关文章