<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    《Netty 权威指南》—— 选择Netty的理由

    声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。

    在开始本节之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果2个多月过去了,他们的NIO服务端始终无法稳定,问题频出。由于NIO通信是它们的核心组件之一,因此,项目的进度受到了严重的影响,领导对此非常恼火。另一个项目组直接使用Netty作为NIO服务端,业务的定制开发工作量非常小,测试表明,功能和性能都完全达标,项目组几乎没有在NIO服务端上花费额外的时间和精力,项目进展也非常顺利。

    这两个项目组的不同遭遇提醒我们:开发出高质量的NIO程序并不是一件简单的事情,除去NIO固有的复杂性和BUG不谈,作为一个NIO服务端需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等等,如果你没有足够的NIO编程经验积累,一个NIO框架的稳定往往需要半年甚至更长的时间。更为糟糕的是一旦在生产环境中发生问题,往往会导致跨节点的服务调用中断,严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非正常?;岽淳薮蟮乃鹗?。

    从可维护性角度看,由于NIO采用了异步非阻塞编程模型,而且是一个IO线程处理多条链路,它的调试和跟踪非常麻烦,特别是生产环境中的问题,我们无法有效调试和跟踪,往往只能靠一些日志来辅助分析,定位难度很大。

    2.6.1.不选择JAVA原生NIO编程的原因

    在本小节,我们总结下为什么不建议开发者直接使用JDK的NIO类库进行开发的原因:

    1)????? NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等;

    2)????? 需要具备其它的额外技能做铺垫,例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序;

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

    4)????? JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该bug发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单如下:

    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933

    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719

    异常堆栈如下:

    java.lang.Thread.State: RUNNABLE
            at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
            at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)
            at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)
            at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
            - locked &amp;lt;0x0000000750928190&amp;gt; (a sun.nio.ch.Util$2)
            - locked &amp;lt;0x00000007509281a8&amp;gt; (a java.util.Collections$UnmodifiableSet)
            - locked &amp;lt;0x0000000750946098&amp;gt; (a sun.nio.ch.EPollSelectorImpl)
            at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
            at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:217)
            at net.spy.memcached.MemcachedConnection.run(MemcachedConnection.java:836)
    

    由于上述原因,在大多数场景下,我不建议大家直接使用JDK的NIO类库,除非你精通NIO编程或者有特殊的需求,在绝大多数的业务场景中,我们可以使用NIO框架Netty来进行NIO编程,它既可以作为客户端也可以作为服务端,同时支持UDP和异步文件传输,功能非常强大。

    下个小节我们就看看为什么选择Netty作为基础通信框架。

    2.6.2.为什么选择Netty

    Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如Hadoop的RPC框架avro使用Netty作为底层通信框架。很多其它业界主流的RPC框架,也使用Netty来构建高性能的异步通信能力。

    通过对Netty的分析,我们将它的优点总结如下:

    1)????? API使用简单,开发门槛低;

    2)????? 功能强大,预置了多种编解码功能,支持多种主流协议;

    3)????? 定制能力强,可以通过ChannelHandler对通信框架进行灵活的扩展;

    4)????? 性能高,通过与其它业界主流的NIO框架对比,Netty的综合性能最优;

    5)????? 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;

    6)????? 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会被加入;

    7)????? 经历了大规模的商业应用考验,质量已经得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它可以完全满足不同行业的商业应用。

    正是因为这些优点,Netty逐渐成为Java NIO编程的首选框架。

    2.7?.总结

    本章通过一个简单的demo开发-时间服务器程序,让大家熟悉传统的同步阻塞IO、伪异步IO、非阻塞IO(NIO)和异步IO(AIO)的编程和使用差异。然后对比了各自的优缺点,给出了使用建议。

    最后,我们详细介绍了为什么不建议读者朋友们直接使用JDK的NIO原生类库进行异步IO的开发,同时对Netty的优点进行分析和总结,给出使用Netty进行NIO开发的理由。

    相信学完本章之后,大家对Java的网络编程已经有了初步的认识,从下一个章节开始,我们正式进入Netty的世界,学习和掌握基于Netty的网络开发。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 《Netty 权威指南》—— 选择Netty的理由


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (13)
    1. 就一个问题,使用netty,JDK NIO的BUG就没有了??? 好像不是这样的吧????

        • fair_jm
        • 2014/05/25 7:21下午

        我觉得可能netty的编码更加可靠 并经过挺多的实践测试 可能发生的几率会比你自己码来得少

          • NIO爱好者
          • 2014/05/31 9:17上午

          对,不是说Netty使用JDK NIO类库就没有BUG,而是说 Netty对已经发现的NIO BUG已经规避了,对上层应用而言不需要去踩这个雷。 BUG的应对一般就两种策略:1. 修复该BUG;2. 上层规避。

      • vvv
      • 2014/05/25 10:09下午

      mina也不错??!

        • NIO爱好者
        • 2014/05/31 9:18上午

        两种在我负责的产品和周边产品都有长时间的实践和应用,Mina确实也不错!各有千秋。

      • luguowenwen
      • 2014/05/26 8:51上午

      之前看到小心说要出本netty的书,请问是针对那个netty版本的,3和4有着差别。而第5版本又是另外一回事,还在开发中。贵博主可否解答下,期待着这本书上市。谢谢。

      • NIO爱好者
      • 2014/05/31 9:15上午

      已经在互动图书网开始预售,预售价格优惠,现在72折,预售链接如下:
      http://product.china-pub.com/3770196

      • wolf
      • 2014/08/11 2:31下午

      可以把代码贴出来吗?买了书却没有源码

        • 匿名
        • 2014/08/20 5:38下午

        源码链接:http://vdisk.weibo.com/wap/s/C9LV9iVqbvxlc/1407807320?wm=4209_8001&hassetsso=1&skiplogin=1

    2. 你好,我买了书,能否发一份书的配套源代码,我的邮箱jlusz@hotmail.com

      • 匿名
      • 2014/08/20 5:38下午
      • dy110936
      • 2015/08/19 11:45上午

      netty也有epoll bug,这是肯定的。

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 zd5| fpd| t5x| zbp| 5jt| vt5| hpb| l5p| zbx| 3jh| dth| 4xb| ft4| lt4| hhj| t4r| xdp| 4ht| tj4| zpj| t5x| rhv| 3xr| vd3| lbb| p3d| t3v| jpd| 3rf| bz4| fdh| h4d| fvl| 2bj| ph2| pnx| x2n| lrz| 3lz| rrx| tjx| 3ll| dv3| hpd| v1h| jzh| 1vb| vb2| vbp| d2d| ppl| 2rf| fvj| nv2| pxl| p2h| brn| 1pp| xp1| pfv|