一、Java NIO 原生存在的问题

  1. NIO 的类库和 API 繁杂使用麻烦:需要熟练掌握 SelectorServerSocketChannelSocketChannelByteBuffer等。
  2. 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。
  3. 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
  4. JDK NIOBug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU100%。直到 JDK1.7 版本该问题仍旧存在,没有被根本解决。文章开头.jpg

    二、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 概述(一) - 图2

三、议论

这里有一个议论,说Netty底层是NIO,但是NIO是同步非阻塞IO模型,为什么Netty是异步呢???
两者是没有关系的。

Netty是异步事件驱动的框架,网络IO模型采用的是NIO(同步非阻塞IO)。异步事件驱动框架体现在所有的I/O操作是异步的,所有的IO调用会立即返回,并不保证调用成功与否,但是调用会返回ChannelFuture,netty会通过ChannelFuture通知你调用是成功了还是失败了亦或是取消了。

io.netty.channel.Channel类的一段注释请参考。

  1. All I/O operations are asynchronous.
  2. All I/O operations in Netty are asynchronous. It means any I/O calls will
  3. return immediately with no guarantee that the requested I/O operation has
  4. been completed at the end of the call. Instead, you will be returned with
  5. a {@link ChannelFuture} instance which will notify you when the requested I/O
  6. operation has succeeded, failed, or canceled.
  7. Netty中的Al1 I/o操作是异步的。这意味着任何1/o调用将立即返回,而不保证请求的1/o操作在调用结束时已经完成。
  8. 相反,你会被返回一个{@link ChannelFuture}实例,当请求的1/0操作成功、失败或取消时,该实例会通知你


所以所谓的异步是针对用户而言的,用户使用Channel进行IO操作,会立即返回。但是这个IO操作的任务是提交给了Netty的NIO底层去进行处理,所以我们说Netty的异步事件驱动与Netty底层基于NIO(同步非阻塞)是不矛盾的。

参考文献**:**https://segmentfault.com/q/1010000016221286/

四、Netty 的优点

  1. 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型-单线程,一个或多个线程池。
  2. 使用方便:详细记录的 Javadoc,用户指南和示例;没有其他依赖项,JDK5(Netty3.x)6(Netty4.x)就足够了。
  3. 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
  4. 安全:完整的 SSL/TLSStartTLS 支持。
  5. 社区活跃、不断更新:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时,更多的新功能会被加入。


五、Netty 能提供的服务

  1. 开发异步非阻塞的TCP网络应用程序
  2. 开发异步非阻塞的UDP网络应用程序
  3. 开发异步文件传输程序
  4. 开发异步HTTP程序的服务端和客户端
  5. 提供多种编解码的集成框架,包括谷歌Protobuf、JBossMarshalling、Java序列化、压缩编解码、XML解码、字符串编解码等都可以由用户直接使用
  6. 提供形式多样的编解码基础类库,可以方便地进行私有协议栈编解码框架的二次开发
  7. 基于职责链的Pipeline-Handler机制,可以方便地对网络事件进行拦截和定制
  8. 所有的IO操作都是异步的,用户可以通过Future-Listeren机制主动get结果或者等IO线程完成操作之后主动Notify来通知,用户业务线程不需要同步等待
  9. 基于链路空闲事件监测的心跳机制
  10. 流量控制和整形
  11. 等等……

    六、Netty 版本说明

  12. Netty 版本分为 Netty 3.xNetty 4.xNetty 5.x

  13. 因为 Netty 5 出现重大 bug,已经被官网废弃了,目前推荐使用的是 Netty 4.x的稳定版本
  14. 目前在官网可下载的版本 Netty 3.xNetty 4.0.xNetty 4.1.x
  15. 在本套课程中,我们讲解 Netty4.1.x 版本
  16. Netty 下载地址:https://bintray.com/netty/downloads/netty/