简介
Netty是一个事件驱动,异步的NIO框架,基于JAVA NIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Reactor(Event-Async)模式,用户可以方便的主动获取或者通过通知机制获得IO操作结果。 作为当前最流行的NIO框架,Netty在double,elasticsearch,RocketMQ等开源框架中也有应用。
Reactor
Reactor其实就是Event(事件驱动)和 RequestHander(接收输入源请求) 和 ServerHander(处理请求),RequestHander也就是NIO中的Selector,由 RequestHander 接收输入源请求后转发给 ServerHander,整个过程由事件驱动的设计模式。
Netty在封装NIO时采用Reactor模式,netty有两个EventLoopGroup,主Group充当Selector,负责监听各channel,接收到请求后转发给从Group,然后由从Group处理请求,Group内置线程池以实现NIO的异步,通过 ChannelPipeline 生成基于事件的调用链。当然,可根据实际情况在从Group的处理过程中添加异步compute的机制。
Buffer
拆包/粘包
- Tcp是个”流“协议,所谓流,就是没有界限的一串数据。一个完整的包,可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
- 解决:
- 消息定长。协议体分为定长消息和不定长消息两部分,传输的不定长消息的长度作为定长消息的一部分。
- 包尾添加特殊分隔符,例如每条报文结束都添加回车换行符(例如FTP协议)或者指定特殊字符作为报文分隔符,接收方通过特殊分隔符切分报文区分。
零拷贝
- 合并buffer: 可以将多个ByteBuf 合并为一个逻辑上的 ByteBuf, 避免了各个 ByteBuf 之间的拷贝
- 文件write不再循环: 通过 FileRegion 包装的FileChannel.tranferTo 实现文件传输, 可以直接将文件缓冲区的数据发送到目标 Channel, 避免了传统通过循环 write 方式导致的内存拷贝问题.
断连机制
自动断连或者心跳断连选其一即可,自动断连是当前channel超过规定时间没有读写则断连,心跳断连是当前channel定时向连接方发送请求,超过规定时间没有回应则断连