Netty是一个高性能 事件驱动的异步的非堵塞的IO(NIO)框架,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已经被很多高性能项目作为其Socket底层基础,如HornetQ Infinispan Vert.x
Play Framework Finangle和 Cassandra。其竞争对手是:Apache MINA和 Grizzly。
传统堵塞的IO读取如下:
InputStream is = new FileInputStream("input.bin");
int byte = is.read();
// 当前线程等待结果到达直至错误
而使用NIO如下:
while (true) {
selector.select();
// 从多个通道请求事件
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectorKey key = (SelectionKey) it.next();
handleKey(key);
it.remove();
}
}
堵塞与非堵塞原理
传统硬件的堵塞如下,从内存中读取数据,然后写到磁盘,而CPU一直等到磁盘写完成,磁盘的写操作是慢的,这段时间CPU被堵塞不能发挥效率。

使用非堵塞的DMA如下图:CPU只是发出写操作这样的指令,做一些初始化工作,DMA具体执行,从内存中读取数据,然后写到磁盘,当完成写后发出一个中断事件给CPU。这段时间CPU是空闲的,可以做别的事情。这个原理称为Zero.copy零拷贝。

Netty底层基于上述Java NIO的零拷贝原理实现:

比较
Tomcat是一个Web服务器,它是采取一个请求一个线程,当有1000客户端时,会耗费很多内存。通常一个线程将花费 256kb到1mb的stack空间。
Node.js是一个线程服务于所有请求,在错误处理上有限制
Netty是一个线程服务于很多请求,如下图,当从Java NIO获得一个Selector事件,将激活通道Channel。

本文详细介绍了Netty的工作原理,包括堵塞与非堵塞IO的区别,以及Netty如何利用Java NIO实现零拷贝。Netty因其高性能、事件驱动的特点,被广泛应用于高性能项目。与Tomcat和Node.js相比,Netty更有效地处理大量并发请求。此外,文章还展示了Netty服务器和客户端的简单代码示例,强调了ChannelPipeline在数据处理中的重要性。
最低0.47元/天 解锁文章
1151

被折叠的 条评论
为什么被折叠?



