netty有必要学吗?有什么优点?

TheDisguiser 2020-08-03 17:23:18 java常见问答 11608

最近有小伙伴们问我,学Java一定要学netty吗?它有什么优点值得我们去学习呢?本篇文章小编就为大家统一讲解。

在java中想要开发出一个高质量的NIO 程序并不是一件容易的事情,不如说任何高质量的东西都不容易得到,在java中,除去NIO 固有的复杂性及Bug不说,作为一个NIO 服务端,需要能够处理业务包括但不限于网络的闪断、客户端的安全认证、客户端的重复接入、消息的编解码、半包读写等各种情况, 如果没有足够的NIO 编程经验积累, 那么一个NIO 框架的稳定通常需要半年甚至更长的时间。更加让人烦恼的是, 一旦在生产环境中发生问题, 往往会导致跨节点的服务调用中断, 严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非正常停机会带来的损失是巨大的。

从可维护性角度看,因为NIO 采用的是异步非阻塞编程模型,且是一个I/O 线程处理多条链路,所以它的调试和跟踪非常麻烦, 特别是生产环境中问题,我们根本无法进行有效的调试和跟踪, 往往只能靠一些日志来帮助分析,定位难度极大。

不使用java中的原生IO原因是:

1、NIO的类库和API繁杂使用麻烦,需要熟练掌握Selectol,ServerSocketChannel,SocketChannel,ByteBuffer 等。

2、需要各种额外技能做铺垫,如java多线程编程。这是因为NIO编程涉及到Reactor 模式,所以必须对多钱程和网络编程非常熟悉,才能编写出高质量的NIO程序。

3、可靠性能力补齐, 工作量及难度都非常大。如客户端面临网络间断、断连重连、失败缓存、半包读写、网络拥塞和异常码流的处理等问题, 但相对来说NI0 编程的特点是功能开发相对容易。

4、JDK NIO的BUG,比如epoll bug,这个BUG会在linux上导致cpu 100%,使得nio server/client不可用,这个BUG直到jdk 6u4才解决,但是直到JDK1.7中仍然有这个问题,该问题并未被完全解决,只是发生的频率降低了而已。

基于以上种种原因所以大多数场景下都不建议直接使原生NIO,除非你是精通NIO编程的大佬或有特殊的需要,否则作为服务器编程的NIO可能会带来巨大的生产隐患。

Netty优点:

1、API使用简单,开发门槛低。

2、功能强大,预置多种编解码功能,支持多种主流协议。

3、定制能力强,通过channelHandler对通信框架进行灵活扩展。

4、性能高。

5、成熟,稳定,修复了所有的jdk nio bug.

6、社区活跃。

7、经历了大规模的商业应用考验,质量得到验证。

所以为了高质量的NIO 程序,netty还是有必要学习的。

以上就是今天的所有内容,如果对一些java基础知识还有不懂的话,记得关注我们了解具体噢。

推荐阅读:

netty和tomcat区别在哪?

java netty教程,实例解析

netty框架与spring区别是什么?