原生NIO存在的问题
- NIO的类库和API繁杂,使用麻烦,需要熟练掌握,Selector,ServerSocketChannel, SocketChannel,ByteBuffer等
- 需要具备其他额外技能,要熟悉Java多线程编程,应为NIO编程涉及到Reactor模式,必须对多线程和网络编程非常熟悉,才能编写出高质量的NIO程序
- 开发工作量和难度都非常大:例如客户端面临断连重连, 网络闪断,半包读写,失败缓存,网络拥塞和异常流的处理等等
- JDK NIO的BUG, 例如臭名昭著的Epoll BUG ,他会导致Selector空轮训,最终导致CPU 100%,直到JDK1.7版本该问题依旧存在,没有被根本解决
Netty官网说明
官网: https://netty.io
Netty is an Asynchronous event-driven network application framework
for rapid development of maintainable high preformance protocol server & client
Netty的优点
Netty对JDK自带的NIO的API进行了封装, 解决了上述问题
- 设计优雅: 适用于各种传输类型的统一API阻塞和非阻塞Socket; 基于灵活且可扩展的事件模型, 可以清晰的分离关注点; 高度可定制的线程模型- 单线程, 一个或多个线程池
- 使用方便: 详细记录的JavaDoc 用户指南和示例, 没有其他依赖项, JDK5(Netty3.x) 或6(Netty4.x) 就足够了
- 高性能,吞吐量高,延迟更低,减少资源消耗,最小化不必要的内存复制
- 安全: 完整的SSL/TLS 和 StartTLS支持
- 社区活跃, 不断更新, 版本迭代周期短, 发现的BUG可以被及时修复,同时更多的新功能会被加入
Netty版本说明
- Netty版本分为Netty3.x 和 4.x 5.x
- 因为Netty 中使用了 ForkJoinPool,增加了代码的复杂度,但是对性能的改善却不明显,多个分支的代码同步工作量很大,作者觉得当下还不到发布一个新版本的时候,在发布版本之前,还有更多问题需要调查一下,比如是否应该废弃 exceptionCaught, 是否暴露EventExecutorChooser等等。所以删除了Netty5的master
- 目前在官网可下载的版本Netty3.x 4.x
- 我们用4.1.x
- netty下载地址: 推荐MAVEN