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();
}
-
构建ChannelBufferOutputStream,是的buffer具有jdk OutputStream的api操作功能,因为序列化工具都是基于jdkAPI的
-
getSerialization(channel) 通过Dubbo的SPI扩展机制得到具体的序列化工具
-
encodeData这里只是将数据序列化后写入传输通道
public Object decode(Channel channel, ChannelBuffer buffer)throws IOException {
InputStream input = newChannelBufferInputStream(buffer);
returndecodeData(channel, getSerialization(channel).deserialize(channel.getUrl(),input));
}
-
构建ChannelBufferInputStream是的序列化工具能够通过jdk的api读取channelBuffer数据的功能
-
通过Dubbo的SPI扩展机制得到具体的序列化实现进行反序列实现
-
decodeData这里只是获取反序列化对象
ExchangeCodec :
交换层是基于请求响应request/response的,在传输层之上封装了Request, Response, ExchangeCodecde层的编码解码就是正对Request, Response的编码解码
DubboCodec:主要是对于dubbo的远程调用请求对象DecodeableRpcInvocation以及请求返回结果DecodeableRpcResult的编码解码。