Netty 是一个被广泛使用的,基于NIO的 Java 网络应用编程框架,Netty框架可以帮助开发者快速、简单的实现客户端和服务端的网络应用程序。“快速”和“简单”并不用产生维护性或性能上的问题。Netty 利用 Java 语言的NIO网络编程的能力,并隐藏其背后的复杂性,从而提供一个易用的 API,基于这些API,我们可以快速编写出一个客户端/服务器网络应用程序。
Netty 成长于用户社区,像大型公司 Facebook 和 Instagram 以及流行的开源项目(Apache
Cassandra、Apache Storm、Elasticsearch、Dubbo等等),都利用其强大的对于网络抽象的核心代码实现网络通信。
Netty 特点
- 高并发:Netty基于NIO(Nonblocking I/O,非阻塞IO)开发,与BIO(Blocking I/O,阻塞IO)相比,并发性能得到显著提升。它的设计采用Reactor模式,通过多线程处理I/O操作,适用于高并发场景。
- 传输快:Netty利用了NIO的零拷贝特性,进一步提升数据传输速度。零拷贝技术减少了数据在内核和用户空间之间的拷贝次数,从而降低了系统调用的开销。
- 封装好:Netty封装了NIO的很多细节,提供了更易使用的API,极大地简化了网络编程的复杂性。开发者不需要直接使用Selector、ServerSocketChannel等复杂的NIO类库,而是通过Netty提供的高层API进行网络应用的开发。
- 可靠性高:Netty解决了JDK NIO中的多个已知Bug,提升了网络应用的可靠性。例如,修复了JDK 1.6中著名的Epoll Bug,避免了CPU 100%的问题。
- 定制扩展强:Netty提供了强大的扩展能力,可以通过实现ChannelHandler来定制通信框架。同时,支持多种主流协议的编解码功能,如HTTP、Protobuf等。
单线程模型
务端用一个线程通过多路复用搞定所有的 IO 操作(包括连接,读、写等),编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑。
netty线程模型
BossGroup负责接收客户端的连接请求。当一个新的连接请求到来时,BossGroup的处理方式是多路复用,即一个线程可以监听多个新的连接请求。BossGroup中的线程数量通常设置为1,这是因为接受连接请求的操作相对较少,不需要过多的线程来进行操作。
WorkerGroup负责处理已经建立连接的数据读写操作,它包含多个线程,每个线程处理一部分连接的数据读写,从而保证并发处理的效率。当BossGroup接收到连接请求并完成TCP三次握手后,会将连接分发给WorkerGroup中的一个线程,由该线程负责后续的I/O操作。这样,多个线程可以并发处理多个连接的读写操作。
NioEventLoopGroup 主要负责监听、接受新的网络连接以及处理相关的 I/O 操作。NioEventLoop表示一个不断循环的执行处理任务的线程。每个 NioEventLoop 中包含有一个 Selector,一个 taskQueue。ioEventLoop 内部采用串行化(Pipeline)设计:责任链模式。
总结
Netty的核心优势在于其基于事件驱动的设计,以及对于NIO的高效利用。Netty的关键组件包括Channel、EventLoop、ChannelPipeline和ChannelHandler等,这些组件协同工作,确保了数据流的高效处理。Channel负责实际的网络I/O操作,EventLoop则负责处理I/O事件和任务调度,而ChannelPipeline和ChannelHandler则合作处理各种网络事件和业务逻辑。
Netty是一个功能丰富且性能卓越的网络应用框架,它为Java网络编程提供了高效、可靠和易于使用的解决方安。无论是在构建高性能的服务器还是复杂的网络协议,Netty都展现出了其强大的能力和广泛的应用前景。