netty(十一)Protobuf版本迭代
背景:
服务端迭代,需要兼容旧版客户端
新版客户端服务端通信数据结果变化
在上一篇的基础上,修改部分服务端代码:
syntax = "proto2";
package myproto;
option java_package = "com.jds.test.proto";
option java_outer_classname = "MyBaseProtoV2";
message Body {
repeated string l = 1; // repeated 列表
optional string newField = 4;
}
message BaseProto {
required int32 code = 1;// 默认值,表示成员只有0个或者1个
required string msg = 2;//
optional Body result = 3;
}
与此前对比,干掉Optional的Type和map,新增一个newField,序列号为4
这个新的proto,编译后放在服务端,客户端用旧版,双方通信,模拟看结果
pipeline.addLast(new ProtobufDecoder(MyBaseProtoV2.BaseProto.getDefaultInstance()));
class ServerHandler4V2 extends SimpleChannelInboundHandler<MyBaseProtoV2.BaseProto> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, MyBaseProtoV2.BaseProto msg) throws Exception {
System.out.println("RESPONSE--------"+msg.toString());
MyBaseProtoV2.BaseProto.Builder builder = MyBaseProtoV2.BaseProto.newBuilder();
builder.setCode(msg.getCode() + 200);
builder.setMsg("server" + msg.getCode());
MyBaseProtoV2.Body.Builder bodyBuilder = MyBaseProtoV2.Body.newBuilder();
bodyBuilder.setNewField(String.valueOf(msg.getCode() + "new msg for client"));
builder.setResult(bodyBuilder.build());
ctx.writeAndFlush(builder.build()).
解码器和接收handler,改为新版数据文件
服务端输出:
server start ......
channelActive
RESPONSE--------code: 0
msg: "msg0"
result {
l: "0"
l: "0"
3: 1
}
RESPONSE--------code: 1
msg: "msg1"
result {
l: "10"
l: "1"
3: 1
}
RESPONSE--------code: 2
msg: "msg2"
result {
l: "20"
l: "4"
3: 1
}
RESPONSE--------code: 3
msg: "msg3"
result {
l: "30"
l: "9"
3: 1
}
RESPONSE--------code: 4
msg: "msg4"
result {
l: "40"
l: "16"
3: 1
}
客户端输出:
server response : code: 200
msg: "server0"
result {
4: "0new msg for client"
}
server response : code: 201
msg: "server1"
result {
4: "1new msg for client"
}
server response : code: 202
msg: "server2"
result {
4: "2new msg for client"
}
server response : code: 203
msg: "server3"
result {
4: "3new msg for client"
}
server response : code: 204
msg: "server4"
result {
4: "4new msg for client"
}
浙公网安备 33010602011771号