如何修正Netty编解码的缺陷

简介: 如何修正Netty编解码的缺陷

为什么会存在二次编解码

  • 把解决半包粘包问题的常用三种解码器叫一次解码器ByteToMessageDecoder

image.png

即从io.netty.buffer. ByteBuf ( 原始数据流) =》 io.netty.buffer .ByteBuf ( 用户数据)


但是在实际业务项目中,除可选的的压缩解压缩,还需一层解码,因为一次解码的结果是字节,需要和项目中所使用的对象做转化,方便使用,这层解码器可以称为“二次解码器”,相应的对应编码器是为了将Java对象转化成字节流方便存储或传输。

于是有了二次解码器:MessageToMessageDecoder

io.netty.buffer.ByteBuf ( 用户数据) =》 Java Object

为何不一步到位?

合并1次解码(解决粘包、半包)和2次解码( 解决可操作问题) ?

可以,但不建议:

  • 没有分层, 不够清晰
  • 耦合性高,不容易置换方案
    比如现在使用 protobuf,以后想用 json,就很麻烦咯。

常用的二次编解码方案

  • Java序列化
  • Marshaling
  • XML
  • JSON
  • MessagePack
  • Protobuf

编解码方案选型

  • 空间
    编码后占用空间,需要比较不同的数据大小情况。
  • 时间
    编解码速度,需要比较不同的数据大小情况。
  • 可读性
  • 多语言(Java 、C、Python 等)的支持


其中以谷歌的Protobuf最为知名。

Protobuf

  • 灵活的、高效的用于序列化数据的协议
  • 相比较XML和JSON格式,Protobuf更小、更快、更便捷
  • Protobuf是跨语言的,并且自带了一个编译器(protoc) ,只需要用它进行编译,可以自动生成Java、python、 C++等代码,不需要再写其他代码。
目录
相关文章
|
6月前
|
编解码
Netty Review - 优化Netty通信:如何应对粘包和拆包挑战_自定义长度分包编解码码器
Netty Review - 优化Netty通信:如何应对粘包和拆包挑战_自定义长度分包编解码码器
92 0
|
6月前
|
编解码 JSON 网络协议
Netty使用篇:Http协议编解码
Netty使用篇:Http协议编解码
|
编解码 网络协议 Java
搞懂Netty(3)使用MessagePack解决编解码问题
使用Netty主要是为了进行网络通信,而网络通信就要涉及到传输数据,数据是不能直接传递的,需要进行一系列处理。java序列化就是其中一种处理方式,但是由于各种各样的缺点,一般不会用,在这里我们介绍一个比较优秀的编码解码技术MessagePack。 这篇文章是我的《搞懂Netty》系列的第三篇,也是在前两篇文章的基础之上进行讲解的。我们使用的是Springboot整合的Netty。
232 0
搞懂Netty(3)使用MessagePack解决编解码问题
|
存储 设计模式 缓存
图文并茂剖析Netty编解码以及背后的设计理念
图文并茂剖析Netty编解码以及背后的设计理念
图文并茂剖析Netty编解码以及背后的设计理念
|
消息中间件 编解码 移动开发
Netty常用招式——ChannelHandler与编解码(二)
Netty常用招式——ChannelHandler与编解码(二)
178 0
Netty常用招式——ChannelHandler与编解码(二)
|
存储 编解码 网络协议
Netty常用招式——ChannelHandler与编解码(一)
Netty常用招式——ChannelHandler与编解码(一)
218 0
Netty常用招式——ChannelHandler与编解码(一)
|
编解码 数据安全/隐私保护
netty之编解码
  1、netty的编码和解码,在数据传输的时候,考虑数据安全,数据完整性都是很有必要的。这里主要是介绍netty3和netty5的编解码方式。其实从StringEncoder和StringDecoder中也可以获取源码的编解码规则。
1014 0
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13497 1
|
6月前
|
消息中间件 Oracle Dubbo
Netty 源码共读(一)如何阅读JDK下sun包的源码
Netty 源码共读(一)如何阅读JDK下sun包的源码
127 1
|
11月前
|
NoSQL Java Redis
跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序
关于Netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对Netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的IM聊天程序。 原本打算做个多人斗地主练习程序,但那需要织入过多的业务逻辑,因此一方面会带来不必要的理解难度,让案例更为复杂化,另一方面代码量也会偏多,所以最终依旧选择实现基本的IM聊天程序,既简单,又能加深对Netty的理解。
160 1