设计思路
- 数据结构定义:
- 定义一个基础的消息头结构,包含消息类型(如请求、响应)、消息ID、序列化版本等字段,用于标识和管理消息。
- 消息体部分根据业务需求进行灵活定义,可以是简单的键值对、复杂的对象或数组等。
- 编解码流程:
- 编码流程:首先填充消息头,根据业务需求将消息体数据转换为字节数组,然后将消息头和消息体按顺序拼接成最终的字节流。
- 解码流程:从字节流中先解析出消息头,根据消息头中的信息(如消息类型、序列化版本),再解析出消息体数据。
- 保证兼容性与扩展性:
- 兼容性:通过在消息头中设置序列化版本字段,在解码时根据版本号采用对应的解码逻辑,以确保新旧版本数据能正确解析。
- 扩展性:设计灵活的数据结构,例如采用可扩展的消息体格式(如JSON、Protocol Buffers等自描述格式),新的业务字段添加时不会影响旧的解析逻辑。同时,预留扩展字段在消息头和消息体中,方便未来扩展功能。
关键代码示例(以Java为例)
- 定义消息头结构:
public class RpcHeader {
private byte messageType;
private int messageId;
private byte serializationVersion;
// getters and setters
public byte getMessageType() {
return messageType;
}
public void setMessageType(byte messageType) {
this.messageType = messageType;
}
public int getMessageId() {
return messageId;
}
public void setMessageId(int messageId) {
this.messageId = messageId;
}
public byte getSerializationVersion() {
return serializationVersion;
}
public void setSerializationVersion(byte serializationVersion) {
this.serializationVersion = serializationVersion;
}
}
- 编码方法:
import java.nio.ByteBuffer;
public class RpcSerializer {
public static byte[] serialize(RpcHeader header, Object body) {
// 假设消息头占用1 + 4 + 1 = 6字节
ByteBuffer byteBuffer = ByteBuffer.allocate(6);
byteBuffer.put(header.getMessageType());
byteBuffer.putInt(header.getMessageId());
byteBuffer.put(header.getSerializationVersion());
// 假设这里使用JSON序列化消息体
String bodyJson = "{\"key\":\"value\"}"; // 实际根据业务转换
byte[] bodyBytes = bodyJson.getBytes();
byte[] result = new byte[byteBuffer.position() + bodyBytes.length];
byteBuffer.flip();
byteBuffer.get(result, 0, byteBuffer.limit());
System.arraycopy(bodyBytes, 0, result, byteBuffer.limit(), bodyBytes.length);
return result;
}
}
- 解码方法:
import java.nio.ByteBuffer;
public class RpcDeserializer {
public static Object[] deserialize(byte[] data) {
ByteBuffer byteBuffer = ByteBuffer.wrap(data);
byte messageType = byteBuffer.get();
int messageId = byteBuffer.getInt();
byte serializationVersion = byteBuffer.get();
RpcHeader header = new RpcHeader();
header.setMessageType(messageType);
header.setMessageId(messageId);
header.setSerializationVersion(serializationVersion);
byte[] bodyBytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bodyBytes);
// 假设这里使用JSON反序列化消息体
String bodyJson = new String(bodyBytes);
// 实际根据业务解析
return new Object[]{header, bodyJson};
}
}