Venus ClientServer Protocol(协议版本号:2)

转至元数据结尾
转至元数据起始

一、总体结构


  • 包结构:有包头+包体,包头固定24字节,包体 由 包头的前面4个字节计算得到的总长度- 24字节(BODY=TOTAL-24)
  • 数字类型:采用网络字节序(大端)传输。
  • String 类型:采用 4+n,注释:4个字节是 字符串根据UTF-8 编码 得到字节数组长度 + UTF-8的Bytes
  • BLOCK 类型:采用4+n,前面4个字节表示该块长度,后面表示字节数
bytes name description
24 PACKET HEAD 包头
n PACKET BODY 包体
     

1、PACKET HEAD

包头是固定格式、固定长度,共24个字节 

Bytes type name description example
4 int packet length 整个数据包长度,包括这个长度的4个字节  
2 short protocol Version venus 协议版本号 1
4 int command Type   0x00000001  = OK
0xFFFFFFFF = ERROR
0x01000001 = PING
0x01000002 = PONG
0x02000001 = SERVICE_REQUEST
0x02000002 = SERVICE_RESPONSE
0x03000001 = HANDSHAKE
0x03100000 = PACKET_TYPE_AUTHEN
0x04000001 = NOTIFY
1 byte serialize Type 数据的系列化方式(比如JSON=0,BSON=1) 服务端也返回与客户端请求时候值一致 0x00 = JSON
0x01 = BSON
0x02 = JAVA_OBJECT
0xFF = 按照握手的时候取值(默认值)
1 byte flags 用来描述该数据包的特性,比如是否是压缩过的,是否加密等等
目前只有在最后一bit表示是否压缩
flags & 0x10 == 1 表示 GZIP
4 int client Id 表示客户端的id号,可全部为0,服务端也返回与客户端请求时候值一致
认证阶段必填,当客户端为proxy角色时必填.
 
8 long client Request Id 客户端的请求号,也可自增长的序号,服务端也返回与客户端请求时候值一致  

2、HandShake Packet(PACKET BODY,command Type=0x03000001)

当客户端连接到服务端的时候,由服务端发送给客户端的第一个数据包。下面表格标识Handshake packet Body

Bytes type name description example
4 int capabilities 标识服务端的能力的字段,每个bit标识一种能力
0x10 -- GZIP
0x10
4 int supportAuthenMethod 标识服务器端能够支持的认证方式
  1. 0x01 << 0  --标识匿名认证(dummy)
  2. 0x01 << 1  --标识用户名、密码方式认证
  3. 0x01 << 2  --PKI方式(2.0.0-BETA还未实现)
  4. 0x06 --支持后面2种模式
  5. 0x03 --支持前面2种模式
0x03
4+n String challenge 服务端发送给客户端的随机字符串(用于加密用户密码)  
4+n String version 服务端使用的Venus服务端版本号 2.0.0-BETA

3、Authen Packet (下面是PACKET BODY,包头:command Type=0x03100000)

客户端接收到服务端的HandShake数据包以后,以authen packet 回应给服务端

标识客户端采用什么方式认证,目前仅支持2种

  1. 0x01 << 0 -- Dummy方式
  2. 0x01 << 1  -- 用户名密码
  3. 0x01 << 2 -- PKI方式(2.0.0-BETA还未实现)

Dummy方式

Bytes type name description example
1 byte authType 标识客户端采用什么方式认证
0x01 << 0 -- Dummy方式
0x01
4 int capabilities 标识客户端能力:比如 0x10 (GZIP) 0x10
1 byte shakeSerializeType
0x00 = JSON 
0x01 = BSON 
0x02 = JAVA_OBJECT
0x00
4+n String client 客户端组件名称 VENUS-JAVA-CLIENT
4+n String version 客户端使用的版本号 2.0.0-BETA
4+n String username 客户端的用户名 venus-client

 用户名密码方式

Bytes type name description example
1 byte authType 标识客户端采用什么方式认证
0x01 << 1  -- 用户名密码
0x02
4 int capabilities 标识客户端能力:比如 0x10 (GZIP) 0x10
1 byte shakeSerializeType
0x00 = JSON 
0x01 = BSON 
0x02 = JAVA_OBJECT
0x00
4+n String client 客户端组件名称 VENUS-JAVA-CLIENT
4+n String version 客户端使用的版本号 2.0.0-BETA
4+n String username 客户端的用户名 venus-client
4+n BLOCK
encryptedPasswd 加密过的密码,加密方式请参阅  

4、OK Packet(下面是PACKET BODY,包头:command Type=0x00000001)

该数据包在服务无返回值的时候,会采用该数据包返回。或者在认证数据包认证成功以后服务端返回

无包体

5、ERROR Packet(下面是PACKET BODY,包头:command Type=0xFFFFFFFF)

Bytes type name description example
4 int errorCode 错误编码 参阅异常编码
4+n String message 错误信息描述  
异常编码
	static final int AUTHEN_EXCEPTION = 18004000; //认证失败

	static final int UNKNOW_EXCEPTION = 18005000; //未知的异常

	static final int INVOCATION_ABORT = 18005001;				//调用终止
	static final int SERVICE_UNAVAILABLE_EXCEPTION = 18005002;		//服务端异常
	static final int SERVICE_NOT_FOUND = 18005003;			//服务未找到
	static final int ENDPOINT_NOT_FOUND = 18005004;				//方法未找到
	static final int NO_PERMISSION = 18005005;				//无此权限
	static final int SERVICE_INACTIVE_EXCEPTION = 18005006;		//service not active

	static final int SERVICE_VERSION_NOT_ALLOWD_EXCEPTION = 18005007;		//service version not allow
	static final int SERVICE_NOT_CALLBACK_EXCEPTION = 18005008;		//no call back

	static final int PARAMETER_INVALID_EXCEPTION = 18006006;	//参数校验异常:通用
	static final int PARAMETER_OMITTED_EXCEPTION = 18006007;	//缺少必需的参数
	static final int PARAMETER_CHECK_EXCEPTION = 18006008;	//参数校验异常:范围,长度等
	static final int PARAMETER_CONVERT_EXCEPTION = 18006009;	//类型转换异常:如int型参数,传入字母


	static final int PACKET_DECODE_EXCEPTION = 18007001;		//数据包解码 异常

	static final int VENUS_CONFIG_EXCEPTION = 18009001;		//venus 配置文件异常(服务端异常)

6、Service Request (下面是PACKET BODY,包头:command Type=0x02000001)

Service Request Packet 是客户端发起服务请求,该数据包是从客户端发往服务器端。数据包在 parametersMap 部分支持压缩,压缩采用GZIP

Bytes type name description example
8 Long -- reserved(填充0) 目前为0
4+n String api Name serviceName.Endpoint HelloService.getHello
4 int service Version 服务版本号  
4+n BLOCK parameters Map
  1. 描述结果的Map结构数据,前面4个字节表示该数据块长度,后面字节存放内容。
  2. 内容可能是JSON字符串(UTF8),也可能是BSON(序列化方式是在创建连接的时候协商的)
  3. 读取该数据块的时候要注意flags,可能存在压缩(条件:flags & 0x10== 1 表示 GZIP)
  4. 写入的时候如果采用压缩,则需要设置flags (flags = flags | 0x10)
如果用json描述:

 "name":"jack",
"age":18
16 byte[] traceId
用于跟踪的16个字节 (@since 3.0.2) ,为兼容之前的版本,该16个字节可能没有
 


7、Service Response (下面是PACKET BODY,包头:command Type=0x02000002)


Service Response packet 是服务端针对Service Request 请求,反馈给客户端的数据包。该数据包 result部分  支持压缩,压缩采用GZIP

Bytes type name description example
4+n BLOCK result
  1. 描述结果的Map结构数据,前面4个字节表示该数据块长度,后面字节存放内容。
  2. 内容可能是JSON字符串(UTF8),也可能是BSON(序列化方式是在创建连接的时候协商的)
  3. 读取该数据块的时候要注意flags,可能存在压缩(条件:flags & 0x10== 1 表示 GZIP)
  4. 写入的时候如果采用压缩,则需要设置flags (flags = flags | 0x10)
如果用json描述:

 "name":"jack",
"age":18
16 byte[] traceId
用于跟踪的16个字节 (@since 3.0.2),为兼容之前的版本,该16个字节可能没有  


Enter labels to add to this page:
Please wait 
查找标签? 在此录入。