Netty使用Google Protobuf实现编解码
Posted 码农的修炼之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty使用Google Protobuf实现编解码相关的知识,希望对你有一定的参考价值。
Google Protobuf是一个开源的高效的序列化工具,在RPC场景下使用广泛。同样,Facebook开源的Thrift也是一款强大的序列化框架。本文旨在和大家探讨怎么在netty框架上使用Protobuf实现快速的编解码。
1、搭建环境
本文的场景是在windows环境下,没有使用Maven环境(使用Maven更方便)。首先,我们要去下载一些文件protoc-2.5.0-win32.zip。同样,还有protobuf-java-2.4.1.jar。
2、编写proto文件
本文编写一个SubscribeReq.proto文件。这种文件编写的格式要符合protobuf规范,这个网上有很多教程和写法。下面看一下文件内容:
其实就是定义了一个消息SubscribeReq,里面包含了4个信息,分别是ID,userName等。在我们日常开发中,消息都是靠消息ID进行解包的。
写完了proto文件,然后我们调用protoc.exe来编译proto文件。编译完成,会生成SubscribeReqProto.java文件。然后我们把这个文件复制到工程的包下。
同样的,将SubscribeReq.proto文件也复制到包下。最后,将之前的Jar包添加到工程Build路径。
3、客户端实现
客户端和之前的案例类似,只是在pipeline中加入了Netty给我们实现好的Protobuf编码器。 所以我们添加ProtobufVarint32LengthFieldPrepender和ProtobufEncoder这两个handler,然后我们实现一个自定义的
ProtoBufClientHandler。代码如下:
我们来看看ProtoBufClientHandler怎么实现的,这里为了省事,直接写了一个内部类。这里为了省事,直接在channel被激活的时候发送一条消息出去。
4、服务端实现
和之前的案例类似,我们在服务端的Pipeline上添加以下这几个Handler,
ProtobufVarint32FrameDecoder、ProtobufDecoder以及自定义的用户处理器ProtoBufServerHandler。代码如下所示:
接下来我们看看自定义的ProtoBufServerHandler怎么实现的。这里和客户端类似,写了一个内部类,我们在channelRead()方法中进行解析protobuf消息。直接看代码:
5、测试
我们启动服务器端和客户端,服务器端运行结果如下:
到这里,说明了我们客户端使用Protobuf编码的消息在服务端已经正确接收到。同时,服务端也能正常解码出来。
6、小结
在实际开发中吗,我们一般只要写一个Proto文件,这里面定义了很多的消息结构体。在代码中体现出来的就是各字段的set/get方法。极大的简化了我们编解码的过程。
以上是关于Netty使用Google Protobuf实现编解码的主要内容,如果未能解决你的问题,请参考以下文章