dubbo协议

dubbo协议说明

协议头约定

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);
    }
原文地址:https://www.cnblogs.com/yjbjingcha/p/7103467.html