23. Dubbo原理解析-编码解码之Codec2接口定义

Dubbo的远程调用需要对传输的数据进行编码解码,dubbo的Codec2接口定义了编码解码规范,与废弃的接口Codec相比,Codec2没有依赖jdk的输入输出流, 以dubbo的ChannelBuffer为核心便于更好的整合

@SPI

public interface Codec2 {

    @Adaptive({Constants.CODEC_KEY})

    void encode(Channel channel, ChannelBufferbuffer, Object message)throws IOException;

    @Adaptive({Constants.CODEC_KEY})

Object decode(Channel channel, ChannelBuffer buffer) throws IOException;

}

TransportCodec:

传输层的编码解码,比较通用没有具体的协议编码

public void encode(Channel channel, ChannelBuffer buffer, Objectmessage)throws IOException {

    OutputStream output = newChannelBufferOutputStream(buffer);

   ObjectOutput objectOutput =getSerialization(channel).serialize(channel.getUrl(), output);

    encodeData(channel, objectOutput, message);

    objectOutput.flushBuffer();

}

  1. 构建ChannelBufferOutputStream,是的buffer具有jdk OutputStream的api操作功能,因为序列化工具都是基于jdkAPI的

  2. getSerialization(channel) 通过Dubbo的SPI扩展机制得到具体的序列化工具

  3. encodeData这里只是将数据序列化后写入传输通道

 

 

 

public Object decode(Channel channel, ChannelBuffer buffer)throws IOException {

  InputStream input = newChannelBufferInputStream(buffer);

  returndecodeData(channel, getSerialization(channel).deserialize(channel.getUrl(),input));

}

  1. 构建ChannelBufferInputStream是的序列化工具能够通过jdk的api读取channelBuffer数据的功能

  2. 通过Dubbo的SPI扩展机制得到具体的序列化实现进行反序列实现

  3. decodeData这里只是获取反序列化对象

 

 

 

ExchangeCodec :

交换层是基于请求响应request/response的,在传输层之上封装了Request, Response, ExchangeCodecde层的编码解码就是正对Request, Response的编码解码 DubboCodec:主要是对于dubbo的远程调用请求对象DecodeableRpcInvocation以及请求返回结果DecodeableRpcResult的编码解码。

代码交流 2021