Netty 编解码技术 数据通信和心跳监控案例

Netty 编解码技术 数据通信和心跳监控案例

多台服务器之间在进行跨进程服务调用时,需要使用特定的编解码技术,对需要进行网络传输的对象做编码和解码操作,以便完成远程调用。Netty提供了完善,易扩展,易使用的编解码技术。本章除了介绍Marshalling的使用,还会基于编解码技术实现数据通信和心跳检测案例。通过本章,你将学到Java序列化的优缺点,主流编解码框架的特点,模拟特殊长连接通信,心跳监控案例。还在等什么,丰满的知识等你来拿!

技术:编解码,数据通信,心跳监控
说明:github上有完整代码,部分文字描述摘录《Netty权威指南》
源码:https://github.com/ITDragonBlog/daydayup/tree/master/Netty/netty-stu

编解码

Netty 的一大亮点就是使用简单,将常用的功能和API进行了很好的封装,编解码也不例外。针对编解码功能,Netty提供了通用的编解码框架常用的编解码类库,方便用户扩展和使用。从而降低用户的工作量和开发门槛。在io.netty.handler.codec目录下找到很多预置的编解码功能.
其实在上一章的知识点中,就已经使用了Netty的编解码技术,如:DelimiterBasedFrameDecoder,FixedLengthFrameDecoder,StringDecoder

什么是编解码技术

编码(Encode)也称序列化(serialization),将对象序列化为字节数组,用于网络传输、数据持久化等用途。
解码(Decode)也称反序列化(deserialization),把从网络、磁盘等读取的字节数组还原成原始对象,以方便后续的业务逻辑操作。

主流编解码框架 Java序列化

Java序列化使用简单开发难度低。只需要实现java.io.Serializable接口并生成序列化ID,这个类就能够通过java.io.ObjectInput序列化和java.io.ObjectOutput反序列化。
但它也有存在很多缺点 :
1 无法跨语言(java的序列化是java语言内部的私有协议,其他语言并不支持),
2 序列化后码流太大(采用二进制编解码技术要比java原生的序列化技术强),
3 序列化性能太低

JBoss的Marshalling

JBoss的Marshalling是一个Java对象的序列化API包,修正了JDK自带序列化包的很多问题,又兼容java.io.Serializable接口;同时可通过工厂类进行参数和特性地配置。
1) 可插拔的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制;
2) 可插拔的对象替换技术,不需要通过继承的方式;
3) 可插拔的预定义类缓存表,可以减小序列化的字节数组长度,提升常用类型的对象序列化性能;
4) 无须实现java.io.Serializable接口,即可实现Java序列化;
5) 通过缓存技术提升对象的序列化性能。
6) 使用范围小,通用性较差。

Google的Protocol Buffers

Protocol Buffers由谷歌开源而来。将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。
1) 结构化数据存储格式(XML,JSON等);
2) 高效的编解码性能;
3) 平台无关、扩展性好;
4) 官方支持Java、C++和Python三种语言。

MessagePack框架

MessagePack是一个高效的二进制序列化格式。和JSON一样跨语言交换数据。但是它比JSON更快、更小(It's like JSON.but fast and small)。
1) 高效的编解码性能;
2) 跨语言;
3) 序列化后码流小;

Marshalling 配置工厂

package com.itdragon.marshalling; import io.netty.handler.codec.marshalling.DefaultMarshallerProvider; import io.netty.handler.codec.marshalling.DefaultUnmarshallerProvider; import io.netty.handler.codec.marshalling.MarshallerProvider; import io.netty.handler.codec.marshalling.MarshallingDecoder; import io.netty.handler.codec.marshalling.MarshallingEncoder; import io.netty.handler.codec.marshalling.UnmarshallerProvider; import org.jboss.marshalling.MarshallerFactory; import org.jboss.marshalling.Marshalling; import org.jboss.marshalling.MarshallingConfiguration; public final class ITDragonMarshallerFactory { private static final String NAME = "serial"; // serial表示创建的是 Java序列化工厂对象.由jboss-marshalling-serial提供 private static final Integer VERSION = 5; private static final Integer MAX_OBJECT_SIZE = 1024 * 1024 * 1; // 单个对象最大长度 /** * 创建Jboss Marshalling 解码器MarshallingDecoder */ public static MarshallingDecoder buildMarshallingDecoder() { // step1 通过工具类 Marshalling,获取Marshalling实例对象,参数serial 标识创建的是java序列化工厂对象 final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory(NAME); // step2 初始化Marshalling配置 final MarshallingConfiguration configuration = new MarshallingConfiguration(); // step3 设置Marshalling版本号 configuration.setVersion(VERSION); // step4 初始化生产者 UnmarshallerProvider provider = new DefaultUnmarshallerProvider(marshallerFactory, configuration); // step5 通过生产者和单个消息序列化后最大长度构建 Netty的MarshallingDecoder MarshallingDecoder decoder = new MarshallingDecoder(provider, MAX_OBJECT_SIZE); return decoder; } /** * 创建Jboss Marshalling 编码器MarshallingEncoder */ public static MarshallingEncoder builMarshallingEncoder() { final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory(NAME); final MarshallingConfiguration configuration = new MarshallingConfiguration(); configuration.setVersion(VERSION); MarshallerProvider provider = new DefaultMarshallerProvider(marshallerFactory, configuration); MarshallingEncoder encoder = new MarshallingEncoder(provider); return encoder; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpywgw.html