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的编码解码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值