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;

}

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

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的编码解码。

给TA打赏
共{{data.count}}人
人已打赏
安全网络

CDN安全市场到2022年价值76.3亿美元

2018-2-1 18:02:50

安全运维

Apache 和 Nginx 的区别

2021-8-18 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索