Netty基础

发布时间 2023-05-26 00:02:07作者: 彷佛昨天

什么是Netty

Netty是一款基于NIONonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIOBlocking I/O,阻塞IO),他的并发性能得到了很大提高。

 

为什么需要使用Netty

1.传统的NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握SelectorServerSocketChannelSocketChannelByteBuffer等。

2.开发工作量和难度都非常大: 例如客户端面临断连重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等等。

3.Netty JDK 自带的 NIO API 进行了良好的封装,解决了上述问题。且Netty拥有高性能、 吞吐量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。

 

为什么Netty使用NIO而不是AIO

原因:在Linux系统上,AIO的底层实现仍使用EPOLL,与NIO相同,因此在性能上没有明显的优势;

WindowsAIO底层实现良好,但是Netty开发人员并没有把Windows作为主要使用平台考虑。

 

Netty使用场景

  1. RPC 框架Dubbo+动态代理设计模式
  2. Rocketmq  netty 数据结构模式
  3. Xxl-job分布式任务调度平台 

TCP协议粘包与拆包

  粘包: buffer(缓冲区)可以存放1024字节,msg1发送10个字节,msg2发送10个字节,msg3发送10个字节 就会合并成一条msg消息

  拆包:buffer(缓冲区)可以存放1024字节,msg1发送2000个字节,就会分成两次发送

产生情况

1.要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;

2.接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;

3.要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;

4.待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS

MSS (最大报文段长度)最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)。

解决方案

LineBasedFrameDecoder的工作原理是它一次遍历ByteBuf中的可读字节,判断看是否有“\n”或者“\r\n”,如果有,就以此位置为结束位置,从可读索引到结束位置区间的字节就组成了一行。它是以换行符为结束标志的解码器,支持携带结束符或者不携带结束符两种解码方式,同时支持配置单行的最大长度。如果连续读取到最大长度后仍然没有出现换行符,就会抛出异常,同时忽略掉之前读到的异常码流。

StringDecoder的功能非常简单,就是将接收到的对象转换成字符串,然后继续调用后面的HandlerLineBasedFrameDecoder+StringDecoder组合就是按行切换的文本解码器,它被设计用来支持TCP的粘包和拆包。

 

ch.pipeline().addLast( new LineBasedFrameDecoder(1024));
ch.pipeline().addLast( new StringDecoder());