您的位置:首页 > 其它

dubbo协议

2015-07-30 16:58 246 查看

dubbo协议说明

协议头约定



请参考dubbo开发者指南

解释

协议格式 header body data

协议头是16字节的定长数据,参见上图dubbo,16*8=128,地址范围0~127

2字节magic字符串0xdabb,0-7高位,8-15低位

1字节的消息标志位。16-20序列id,21 event,22 two way,23请求或响应标识

1字节状态。当消息类型为响应时,设置响应状态。24-31位。

8字节,消息ID,long类型,32-95位。

4字节,消息长度,96-127位

源代码参考

com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec

protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request req) throws IOException {
Serialization serialization = getSerialization(channel);
// header.
byte[] header = new byte[HEADER_LENGTH];
// set magic number.
Bytes.short2bytes(MAGIC, header);

// set request and serialization flag.
header[2] = (byte) (FLAG_REQUEST | serialization.getContentTypeId());

if (req.isTwoWay()) header[2] |= FLAG_TWOWAY;
if (req.isEvent()) header[2] |= FLAG_EVENT;

// set request id.
Bytes.long2bytes(req.getId(), header, 4);

// encode request data.
int savedWriteIndex = buffer.writerIndex();
buffer.writerIndex(savedWriteIndex + HEADER_LENGTH);
ChannelBufferOutputStream bos = new ChannelBufferOutputStream(buffer);
ObjectOutput out = serialization.serialize(channel.getUrl(), bos);
if (req.isEvent()) {
encodeEventData(channel, out, req.getData());
} else {
encodeRequestData(channel, out, req.getData());
}
out.flushBuffer();
bos.flush();
bos.close();
int len = bos.writtenBytes();
checkPayload(channel, len);
Bytes.int2bytes(len, header, 12);

// write
buffer.writerIndex(savedWriteIndex);
buffer.writeBytes(header); // write header.
buffer.writerIndex(savedWriteIndex + HEADER_LENGTH + len);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: