Netty权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

大约在2008年的时候,我参与设计和开发的一个电信系统在月初出帐期,总是发生大量的连接超时和读写超时异常,业务的失败率相比于平时高了很多,报表中的很多指标都差强人意。后来经过排查,发现问题的主要原因出现在下游网元的处理性能上,月初的时候BSS出帐,在出帐期间BSS系统运行缓慢,由于双方采用了同步阻塞式的HTTP+XML进行通信,导致任何一方处理缓慢都会影响对方的处理性能。按照故障隔离的设计原则,对方处理速度慢或者不回应答,不应该影响系统的其他功能模块或者协议栈,但是在同步阻塞I/O通信模型下,这种故障传播和相互影响是不可避免的,很难通过业务层面解决。

受限于当时Tomcat和Servlet的同步阻塞I/O模型,以及在Java领域异步HTTP协议栈的技术积累不足,当时我们并没有办法完全解决这个问题,只能通过调整线程池策略和HTTP超时时间来从业务层面做规避。

2009年,由于对技术的热爱,我作为业务骨干被领导派去参加一个重点业务平台的研发工作,与两位资深的架构师(其中一位工作20年,做华为交换机出身)共同参与。这是我第一次全面接触异步I/O编程和高性能电信级协议栈的开发,眼界大开——异步高性能内部协议栈、异步HTTP、异步SOAP、异步SMPP……所有的协议栈都是异步非阻塞。后来的性能测试表明:基于Reactor模型统一调度的长连接和短连接协议栈,无论是性能、可靠性还是可维护性,都可以“秒杀”传统基于BIO开发的应用服务器和各种协议栈,这种差异本质上是一种代差。

在我从事异步NIO编程的2009年,业界还没有成熟的NIO框架,那个时候Mina刚刚开始起步,功能和性能都达不到商用标准。最困难的是,国内Java领域的异步通信还没有流行,整个业界的积累都非常少。那个时候资料匮乏,能够交流和探讨的圈内人很少,一旦踩住“地雷”,就需要夜以继日地维护。在随后2年多的时间里,经历了10多次的在通宵、凌晨被一线的运维人员电话吵醒等种种磨难之后,我们自研的NIO框架才逐渐稳定和成熟。期间,解决的BUG总计20~30个。

从2004年JDK1.4首次提供NIO 1.0类库到现在,已经过去了整整10年。JSR 51的设计初衷就是让Java能够提供非阻塞、具有弹性伸缩能力的异步I/O类库,从而结束Java在高性能服务器领域的不利地位。然而,在相当长的一段时间里,Java的NIO编程并没有流行起来,究其原因如下。

1.大多数高性能服务器,被C和C++语言盘踞,由于它们可以直接使用操作系统的异步I/O能力,所以对JDK的NIO并不关心;

2.移动互联网尚未兴起,基于Java的大规模分布式系统极少,很多中小型应用服务对于异步I/O的诉求不是很强烈;

3.高性能、高可靠性领域,例如银行、证券、电信等依然以C++为主导,Java充当打杂的角色,NIO暂时没有用武之地;

4.当时主流的J2EE服务器,几乎全部基于同步阻塞I/O构建,例如Servlet、Tomcat等,由于它们应用广泛,如果这些容器不支持NIO,用户很难具备独立构建异步协议栈的能力;

5.异步NIO编程门槛比较高,开发和维护一款基于NIO的协议栈对很多中小型公司来说像是一场噩梦;

6.业界NIO框架不成熟,很难商用;

7.国内研发界对NIO的陌生和认识不足,没有充分重视。

基于上述几种原因,NIO编程的推广和发展长期滞后。值得欣慰的是,随着大规模分布式系统、大数据和流式计算框架的兴起,基于Java来构建这些系统已经成为主流,NIO编程和NIO框架在此期间得到了大规模的商用。在互联网领域,阿里的分布式服务框架Dubbo、RocketMQ,大数据的基础序列化和通信框架Avro,以及很多开源的软件都已经开始使用Netty来构建高性能、分布式通信能力,Netty社区的活跃度也名列前茅。根据目前的信息,Netty已经在如下几个领域得到了大规模的商业应用。

1.互联网领域;

2.电信领域;

3.大数据领域;

4.银行、证券等金融领域;

5.游戏行业;

6.电力等企业市场。

2014年春节前,我分享了一篇博文《Netty5.0架构剖析和源码解读》,短短1个月下载量达到了4000多。很多网友向我咨询NIO编程技术、NIO框架如何选择等问题,也有一些圈内朋友和出版社邀请我写一本关于Netty的技术书籍。作为最流行、表现最优异的NIO框架,Netty深受大家喜爱,但是长期以来除了UserGuide之外,国内鲜有Netty相关的技术书籍供广大NIO编程爱好者学习和参考。由于Netty源码的复杂性和NIO编程本身的技术门槛限制,对于大多数读者而言,通过自己阅读和分析源码来深入掌握Netty的设计原理和实现细节是件困难的事情。从2011年开始我系统性的分析和应用了Netty和Mina,转瞬间已经过去了3年多。在这3年的时间里,我们的系统经受了无数严苛的考验,在这个过程中,对Netty和Mina有了更深刻的体验,也积累了丰富的运维和实战经验。我们都是开源框架Netty的受益者,为了让更多的朋友和同行能够了解NIO编程,深入学习和掌握Netty这个NIO利器,我打算将我的经验和大家分享,同时也结束国内尚无Netty学习教材的尴尬境地。

联系方式

尽管我也有技术洁癖,希望诸事完美,但是由于Netty代码的庞杂和涉及到的知识点太多,一本书籍很难涵盖所有的功能点。如有遗漏或者错误,恳请大家能够及时批评和指正,如果你有好的建议或者想法,也可以联系我。我的联系方式如下。

邮箱:neu_lilinfeng@sina.com。

新浪微博:Nettying。

微信:Nettying。

致谢

如果说个人能够改变自己命运的话,对于程序员来说,唯有通过不断的学习和实践,努力提升自己的技能,才有可能找到更好的机会,充分发挥和体现自己的价值。我希望本书能够为你的成功助一臂之力。

感谢博文视点的策划编辑丁一琼和幕后的美编,正是你们的辛苦工作才保证了本书能够顺利出版;感谢华为Netty爱好者和关注本书的领导同事们的支持,你们的理解和鼓励为我提供了足够的勇气。感谢我的家人和老婆的支持,写书占用了我几乎所有的业余时间,没有你们的理解和支持,我很难安心写作。

最后感谢Netty中国社区的朋友,我的微博粉丝和所有喜欢Netty的朋友们,你们对技术的热情是鼓励我写书的最重要动力,没有你们,就没有本书。希望大家一如既往的喜欢NIO编程,喜欢Netty,以及相互交流和分享,共同推动整个国内异步高性能通信领域的技术发展。

李林锋

5月11日于南京紫轩阁