你知道Netty是怎么完成更高功能的吗?

来源:java开发者 ·2018年08月19日 13:35

作为言语根底类库,Java 本身的 NIO 规划更偏底层,这本无可厚非,可是关于一线的运用开发者,其杂乱性、扩展性等方面,就存在必定的限制了。在根底 NIO 之上,Netty 构建了愈加易用、高功用的网络结构,广泛运用于互联网、游戏、电信等各种范畴。

比照 Java 规范 NIO 类库,你知道 Netty 是怎么完成更高功用的吗?

典型答复

独自从功用视点,Netty 在根底的 NIO 等类库之上进行了许多改善,例如:

愈加高雅的 Reactor 形式完成、灵敏的线程模型、运用 EventLoop 等立异性的机制,能够十分高效地办理成百上千的 Channel。

充分运用了 Java 的 Zero-Copy 机制,而且从多种视点,“锱铢必较”般的下降内存分配和收回的开支。例如,运用池化的 Direct Buffer 等技能,在进步 IO 功用的一起,减少了方针的创建和毁掉;运用反射等技能直接操作 SelectionKey,运用数组而不是 Java 容器等。

运用更多本地代码。例如,直接运用 JNI 调用 Open SSL 等方法,取得比 Java 内建 SSL 引擎更好的功用。

在通信协议、序列化等其他视点的优化。

总的来说,Netty 并没有 Java 中心类库那些激烈的通用性、跨渠道等各种担负,针对功用等特定方针以及 Linux 等特定环境,采取了一些极致的优化手法。

常识扩展

首要,咱们从全体了解一下 Netty。依照官方界说,它是一个异步的、根据事情 Client/Server 的网络结构,方针是供给一种简略、快速构建网络运用的方法,一起确保高吞吐量、低延时、高可靠性。

从规划思路和意图上,Netty 与 Java 本身的 NIO 结构比较有哪些不同呢?

咱们知道 Java 的规范类库,因为其根底性、通用性的定位,往往过于重视技能模型上的笼统,而不是从一线运用开发者的视点去考虑。我曾提到过,引进并发包的一个重要原因就是,运用开发者运用 Thread API 比较苦楚,需求操心的不仅仅是事务逻辑,而且还要自己担任将其映射到 Thread 模型上。Java NIO 的规划也有相似的特色,开发者需求深化把握线程、IO、网络等相关概念,学习途径很长,很简单导致代码杂乱、不流畅,即使是有经历的工程师,也难以快速地写出高可靠性的完成。

Netty 的规划强调了 “Separation Of Concerns”,经过精巧规划的事情机制,将事务逻辑和无关技能逻辑进行阻隔,并经过各种便利的笼统,必定程度上添补了了根底渠道和事务开发之间的距离,更有利于在运用开发中遍及业界的最佳实践。

别的,Netty > java.nio + java. net!

从 API 才能规模来看,Netty 完全是 Java NIO 结构的一个大大的超集,你能够参阅 Netty 官方的模块区分。

除了中心的事情机制等,Netty 还额定供给了许多功用,例如:

从网络协议的视点,Netty 除了支撑传输层的 UDP、TCP、SCTP协议,也支撑 HTTP(s)、WebSocket 等多种运用层协议,它并不是单一协议的 API。

在运用中,需求将数据从 Java 方针变换成为各种运用协议的数据格式,或许进行反向的变换,Netty 为此供给了一系列扩展的编解码结构,与运用开发场景无缝联接,而且功用杰出。

它扩展了 Java NIO Buffer,供给了自己的 ByteBuf 完成,而且深度支撑 Direct Buffer 等技能,乃至 hack 了 Java 内部对 Direct Buffer 的分配和毁掉等。一起,Netty 也供给了愈加完善的 Scatter/Gather 机制完成。

2008~2017 家电新闻网 Inc. All rights reserved.