我们接触的几种Java提供的IO机制,作为语言基础类库,Java自身的NIO很偏向底层,在NIO之上,则是由Netty构建了更加易用,更加高性能的网络框架,广泛的应用于互联网,游戏,电信等领域

Netty在基础的NIO类库之上进行了很多的改进,更加优雅的Reactor实现,灵活的线程模型,利用EventLoop等机制,高效的管理成千上百的Channel

利用了Java的Zero-Copy机制,从多种角度,斤斤计较内存分配,池化了DirectBuffer等技术,提高IO性能的同时,减少了对象的创建和销毁,利用反射来操作SelectionKey,基于数组而不是Java的容器

更加利用本地的代码,直接利用JNI调用Open SSL等方式,获得比Java内建SSL引擎更好的性能

通讯协议,序列化等角度的优化

总的来说,Netty还根据Linux等特定的环境,采取了一些更加激进的极致优化手段

我们了解了Netty,一个异步的,基于事件触发的Client/Server的网络框架,目标提供一种简单的,快速构建网络应用的方式,保证了高吞吐量,低延迟,高可靠性

那么,Netty和Java自身的NIO框架有什么不同呢?

Java类库本身提供的NIO,是一个抽象的概念,并不是根据一线应用开发思考的,难以理解

NIO则是屏蔽了这些,强调Separation Of Concerns,通过巧妙的事件机制,进行业务和无关技术的隔离

对于API,Netty>java.nio + java.net

图片

Netty还有很多额外的功能

从网络协议层,除了UDP TCP SCTP的协议,还支持HTTPS WebSocket等应用层协议,并不是单一协议的API

在应用中,将数据从Java对象转换成各种应用协议的数据格式,进行反向的转换,Netty为此提供了一系列扩展的编解码框架,和应用开发场景无缝转换,性能良好

扩展了Java NIO Buffer,提供了自己的ByteBuf实现,深度支持Direct Buffer等技术,hack了Java内部对Direct Buffer分配和销毁,还有着更加完善的Scatter/Gather机制实现

Netty范围大大超过了java核心类库中的NIO等API

我们先看一下Netty应用的具体样子

图片

ServerBootstrap,服务器端程序的入口,这是Netty为简化网络配置和关闭等生命周期,引入的Bootstrapping机制,我们需要做的,就是创建Channel,绑定端口,注册Handler,通过这个统一的入口,以Fluent API等形式存在,简化了API

Channel,基于NIO的扩展框架,Channel 和 Selector等概念是Netty的基础组件

EventLoop,核心机制,注册感兴趣的事件,调度对应的Handler,都是EventLoop做的

ChannelFuture,Netty实现异步IO的基础,Channel的调度殊勋

ChannelHandler 业务逻辑的主要地方

ChannelPipeline,是ChannelHandler链条的容器,每个Channl创建后自动分配一个ChannelPipeline,用于分配任务

图片

对比Java标准的NIO代码,Netty提供的更加高层次的封装,减少了对Selector等细节的操纵,简化了编程模型,开发者不担心并发等问题,一定程度上简化了代码的开发.

针对Netty的实现,我们可能见到的考点有

Reacotr模式和Netty线程模型

Pipelining,EventLoop等部分设计实现细节

Netty的内存管理机制,引用计数等特别手段

还有就是Java NIO早期版本中Epoll的空转问题

发表评论

邮箱地址不会被公开。 必填项已用*标注