由于项目开发中需要用的网络通信,就研究了一下Netty的使用方法、原理及源码。现在总结学习新的及经验分享给大家。
一、为什么不选择Java原生的NIO
在JDK1.4版本中已经引入了NIO,NIO弥补了原来同步阻塞I/O的不足,它在Java代码中提供了高速的、面向块的I/O。
为什么不选择Java原生的NIO主要体现在以下几方面:
1、NIO的类库和API复杂
在使用Java原生NIO需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等类库或AIP。而这些类都相当的繁琐,不宜掌握。
2、需要其他技能的铺垫
NIO主要是非阻塞网络I/O,多路复用等技术,由于NIO编程涉及到了Reactor线程模式编程,需要熟练掌握Java的多线程编程技术。而Java的多线程编程技术又是一个相当复杂难以掌握的技能。
3、可靠性能力补齐,难度和共工作量都非常大
在网络编程中客户端面临着断连重连、网络闪断、读写半包、缓存失败、码流控制和网络控制等复杂的问题处理。所以NIO编程的特点是功能实现容易,但是可靠性能力补齐工作量和难度都非常大。
4、JDK NIO的缺陷。NIO可能会导致Selector的空轮询,最终导致CPU 使用达到100%,导致系统宕机。
二、为什么选择Netty
首先Netty是一个基于NIO实现的事件驱动的异步网络应用框架。Netty大大简化了TCP和UDP等网络程序的开发步骤,其从FTP、SMTP、HTTP、许多二进制和基于文本的传统协议等协议中吸取了经验,使得Netty在开发效率、性能、稳定性、灵活性等方面都有优异的表现。其次Netty也是业界流行的NIO框架之一,其它的健壮性、性能、功能、可定制性和可扩展性等方面都首屈一指。
使用Netty的原因主要有以下几方面:
1、API使用简单,开发门槛低。
2、功能强大,内置了多种编码功能,支持多种主流协议
3、定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展。
4、性能高,通过与其他框架相比较,Netty的综合性能最优。
5、成熟、稳定,Netty修复了JDK NIO的BUG,在开发过程中不需要关心这些BUG。
6、社区活跃,版本的迭代周期短,发现BUG能够及时进行修复。
7、经历了大规模的商业应用实践,质量得到了验证,其在互联网、大数据、网络游戏、企业应用等方面都得到了应用。
说明:在学习过程中主要参考了 《Netty实践》、《Netty权威指南第二版》和网络博客。写此博客主要是作为学习笔记,增强记忆。