前言
在之前的两篇文章中
fescar源码分析-AbstractRpcRemotingClient补充
fescar源码分析-AbstractRpcRemotingServer
可以了解到,fescar在基于Netty实现RPC客户端及服务端时,都会在pipline
中配置一个MessageCodecHandler
。
MessageCodecHandler
继承于ByteToMessageCodec<RpcMessage>类,实现了对出入站的数据进行编解码操作的进一步封装:
-
实现解码操作(decode),将入站中的
ByteBuf
类型的数据转换为RpcMessage
类型的数据。
-
实现编码操作(encode),将出站中的
RpcMessage
类型的数据转换为ByteBuf
类型的数据。
其中RpcMessage
对象是fescar定义的RPC调用的统一数据结构。
*id 是一个消息的序列号。
- isAsync 表示是否为异步请求。
- isRequest 表示是否为请求消息(还有可能是请求的返回消息。)
- isHeartbeat 表示是否为心跳消息。
- body 消息的主要内容,可以转换为
MessageCodec
接口类型的数据。
MessageCodec
接口的定义如下:
public interface MessageCodec {
short getTypeCode();//消息类型
byte[] encode(); //将POJO对象转换为字节数组
boolean decode(ByteBuf in);//将ByteBuf中的字节数组转换为POJO对象
}
通过下图可以看到fescar封装有哪些消息类型数据:
其中消息类型的关键字可以与如下示意图中的关键字相对应。