一、Java NIO 原生存在的问题
NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。- 需要具备其他的额外技能:要熟悉
Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的NIO程序。 - 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
JDK NIO的Bug:例如臭名昭著的Epoll Bug,它会导致Selector空轮询,最终导致CPU100%。直到JDK1.7版本该问题仍旧存在,没有被根本解决。
二、Netty 官网说明
官网地址: https://netty.io/
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。
**
三、议论
这里有一个议论,说Netty底层是NIO,但是NIO是同步非阻塞IO模型,为什么Netty是异步呢???
两者是没有关系的。
Netty是异步事件驱动的框架,网络IO模型采用的是NIO(同步非阻塞IO)。异步事件驱动框架体现在所有的I/O操作是异步的,所有的IO调用会立即返回,并不保证调用成功与否,但是调用会返回ChannelFuture,netty会通过ChannelFuture通知你调用是成功了还是失败了亦或是取消了。
io.netty.channel.Channel类的一段注释请参考。
All I/O operations are asynchronous.All I/O operations in Netty are asynchronous. It means any I/O calls willreturn immediately with no guarantee that the requested I/O operation hasbeen completed at the end of the call. Instead, you will be returned witha {@link ChannelFuture} instance which will notify you when the requested I/Ooperation has succeeded, failed, or canceled.Netty中的Al1 I/o操作是异步的。这意味着任何1/o调用将立即返回,而不保证请求的1/o操作在调用结束时已经完成。相反,你会被返回一个{@link ChannelFuture}实例,当请求的1/0操作成功、失败或取消时,该实例会通知你
所以所谓的异步是针对用户而言的,用户使用Channel进行IO操作,会立即返回。但是这个IO操作的任务是提交给了Netty的NIO底层去进行处理,所以我们说Netty的异步事件驱动与Netty底层基于NIO(同步非阻塞)是不矛盾的。
参考文献**:**https://segmentfault.com/q/1010000016221286/
四、Netty 的优点
- 设计优雅:适用于各种传输类型的统一
API阻塞和非阻塞Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型-单线程,一个或多个线程池。 - 使用方便:详细记录的
Javadoc,用户指南和示例;没有其他依赖项,JDK5(Netty3.x)或6(Netty4.x)就足够了。 - 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
- 安全:完整的
SSL/TLS和StartTLS支持。 - 社区活跃、不断更新:社区活跃,版本迭代周期短,发现的
Bug可以被及时修复,同时,更多的新功能会被加入。
五、Netty 能提供的服务
- 开发异步非阻塞的TCP网络应用程序
- 开发异步非阻塞的UDP网络应用程序
- 开发异步文件传输程序
- 开发异步HTTP程序的服务端和客户端
- 提供多种编解码的集成框架,包括谷歌Protobuf、JBossMarshalling、Java序列化、压缩编解码、XML解码、字符串编解码等都可以由用户直接使用
- 提供形式多样的编解码基础类库,可以方便地进行私有协议栈编解码框架的二次开发
- 基于职责链的Pipeline-Handler机制,可以方便地对网络事件进行拦截和定制
- 所有的IO操作都是异步的,用户可以通过Future-Listeren机制主动get结果或者等IO线程完成操作之后主动Notify来通知,用户业务线程不需要同步等待
- 基于链路空闲事件监测的心跳机制
- 流量控制和整形
-
六、Netty 版本说明
Netty版本分为Netty 3.x和Netty 4.x、Netty 5.x- 因为
Netty 5出现重大bug,已经被官网废弃了,目前推荐使用的是Netty 4.x的稳定版本 - 目前在官网可下载的版本
Netty 3.x、Netty 4.0.x和Netty 4.1.x - 在本套课程中,我们讲解
Netty4.1.x版本 Netty下载地址:https://bintray.com/netty/downloads/netty/
