《Netty实战》Netty In Action中文版——文前内容

《Netty实战》样章由人民邮电出版社授权并发编程网发布,本书的中文版已经由人民邮电出版社引进并出版。

京东预售链接(优先发货):《Netty实战》([美]诺曼·毛瑞尔(Norman Maurer),马文·艾伦·沃尔夫泰尔(Marvin Allen Wolfthal))

 

内容提要

本书是为想要或者正在使用Java从事高性能网络编程的人而写的,循序渐进地介绍了Netty各个方面的内容。

本书共分为4个部分:第一部分详细地介绍Netty的相关概念以及核心组件,第二部分介绍自定义协议经常用到的编解码器,第三部分介绍Netty对于应用层高级协议的支持,会覆盖常见的协议及其在实践中的应用,第四部分是几个案例研究。此外,附录部分还会简单地介绍Maven,以及如何通过使用Maven编译和运行本书中的示例。

阅读本书不需要读者精通Java网络和并发编程。如果想要更加深入地理解本书背后的理念以及Netty源码本身,可以系统地学习一下Java网络编程、NIO、并发和异步编程以及相关的设计模式。

中文版序

现代互联网架构,分布式系统是一个绕不开的话题。一款优秀的网络通信框架将在分布式系统的构建中起到举足轻重的作用。其中,特别出名的有SUN公司的Grizzly框架、JBoss的XIO、Apache的MINA以及赫赫有名也是使用最广泛的Netty框架。

需要指出的是,网络通信框架的优秀不仅仅体现在性能和效率上,更重要的体现是,是否能够屏蔽底层复杂度,编程模型是否简单易懂,是否适用更多的应用场景,以及开发社区是否活跃。Netty的成功正是很好地满足了上述的这几点。作为互联网从业人员,熟悉基于Netty网络编程乃至深入理解Netty的设计和实现,对于无论是自研系统,还是学习开源产品,都有很大的帮助。

网络上介绍、分析Netty的中文文章不少,其中能够做到成体系介绍,深入浅出,原理应用并重的寥寥。Manning出版社的《Netty in Action》是一本出色的Netty教程。通过对这本书的学习,读者可以快速掌握基于Netty的编程,以及框架背后的设计哲学。可惜一直没有国内出版社引进出版中文版,像我这样的英文苦手,只能硬着头皮去啃英文版本,不仅学得慢,有些章节还不能很好地领会作者的意图。

很高兴地得知这本经典著作要在国内出版中文版,并且是由对Netty研究很深的工程师——何品——翻译的。我和何品打过几次交道,深入探讨过分布式架构以及网络通信框架方面的话题,受益良多。同时,也很惊讶于何品对技术的痴迷,以及他的技术深度和广度。诚挚地邀请他加入我们团队未果,甚为遗憾。十分期待这本书能很快出版发行,相信本书中文版的出版对投身互联网系统开发的工程师快速掌握Netty会有很大的帮助。

罗毅

阿里巴巴中间件技术部高级技术专家

 

译者序

在后来又接触到了Play和Akka,并且在得知了这些高性能网络编程和并发框架的底层正是基于Netty的时候,更是让我肯定了自己过去的投入,Netty FTW!那时,正值Netty 4重写,从源头改善了很多问题,提供了更好的并发模型,进一步降低了GC消耗。在跟进Netty 4的开发过程的同时,我也不断地丰富自己的知识和经验,并开启了我后续职业生涯的大门。再后来,当我得知Norman正在编写一本关于Netty的书的时候,非常激动,最终得以读到本书的MEAP版本,并能够有幸参与这本书的翻译工作。

这本书循序渐进、系统性地讲解了Netty的各个组件,以及其背后的设计哲学,并且对于想要深入理解Netty源代码的读者给出了相应的指导。难能可贵的是,这本书还附带了5个由行业一线公司撰写的Netty在实践中的案例研究,并贴心地准备了一个Maven相关的介绍。

本书的翻译经历了两个夏天和两个冬天(MEAP版开始同步翻译)。为了能给大家呈现一个尽可能完善的中文版译本,我尽可能地使用了最新的原版书稿,并就书中的内容和原作者进行了积极的沟通。但是碍于个人水平有限,一些纰漏还请大家通过https://github.com/ReactivePlatform/ netty-in-action-cn和我取得联系,也欢迎大家与我讨论书中代码清单相关的问题。

最后,我要感谢本书的编辑的耐心和悉心指导,感谢帮我牵线的InfoQ的臧秀涛,以及帮我审读了这本书的朋友们。当然,还要感谢我的家人,在他们的支持和理解下,这本书才得以完成,并呈现在大家的面前。

译者简介

何品 目前是淘宝的一名资深软件工程师,热爱网络、并发、异步相关的主题以及函数式编程,同时也是Netty、Akka等项目的贡献者,活跃于Scala社区,目前也在从事GraphQL相关的开发工作。

运行一个如此庞大的分布式系统引发了两个有趣的问题:运行成本和延迟。如果我们将单个节点的性能提高30%,或者甚至超过100%,那么我们可以节省多少台机器呢?当一个来自Web浏览器的查询触发了几十个跨越了很多不同机器的内部远程过程调用时,我们如何能达到最低的延迟呢?

在本书(第一本关于Netty项目的书)中,Norman Maurer(Netty的核心贡献者之一)通过展示如何使用Netty构建高性能、低延迟的网络应用程序,给出了这些问题的最终答案。读完这本书,你就能够构建所有可能的网络应用程序了,从轻量级的HTTP服务器到高度定制化的RPC服务器。

本书之所以能令人印象深刻,一方面是因为它是由知晓Netty每个细节的核心贡献者编写的,另一方面是因为它包含了几家在其生产系统中使用了Netty的公司(Twitter、Facebook和Firebase等)的案例研究。我相信,通过展示这些使用它们的公司是如何能够释放他们基于Netty的应用程序的能力的,这些案例研究将会启迪你。

你可能会惊奇地发现,早在2001年,Netty只是我的个人项目,当时我是一名本科生(http://t.motd.kr/ko/archives/1930),而今天这个项目仍然还在并且还充满了活力,感谢像Norman这样的热心的贡献者们,他们花了许多个不眠之夜来致力于该项目(http://netty.io/community.html)。我希望通过鼓励本书的读者来贡献项目,开启该项目的另一个篇章,继续“开启网络编程的未来”。

Trustin Lee

Netty项目创始人

前言

当我从2011年年末开始为Netty做贡献时,我怎么也想不到我会写一本关于Netty的书,并且成为该框架本身的核心开发者之一。

这一切都始于我在2009年参与的Apache James项目,一个在Apache软件基金会下开发的基于Java的邮件服务器。

像许多应用程序一样,Apache James需要构建在一个坚实的网络抽象之上。在考察提供网络抽象的项目领域时,我偶然地发现了Netty,并且立即就爱上了它。在我从用户的角度更加地熟悉了Netty之后,我便开始转向改进它和回馈社区。

尽管我第一次贡献的范围有限,但是很快变得明显的是,进行贡献以及和社区进行相关问题的讨论,尤其是和项目的创始人Trustin Lee,对于我的个人成长非常有益。这样的经验牢牢地吸引了我,我喜欢将我的空闲时间更多地投入到社区中。我在邮件列表上提供帮助,并且加入了IRC频道的讨论。致力于Netty开始是一种爱好,但很快就演变成了一种激情。

我对Netty的激情最终导致我在Red Hat就业。这简直是美梦成真,因为Red Hat雇佣我来致力于我所热爱的项目。我最终知道了Claus Ibsen在那时正(现在仍然)致力于Apache Camel。Claus和我认识到,虽然Netty拥有坚实的用户基础以及良好的JavaDoc,但是它缺乏一个更加高级别的文档。Claus是《Camel in Action》(Manning,2010)的作者,他给了我为Netty写一本类似的书的想法。关于这个想法,我考虑了几个星期,最终接受了。这也就有了本书。

在编写本书的过程中,我也越来越多地参与到了社区中。伴随着超过1000次的提交[1],我最终成为了仅次于Trustin Lee的最活跃的贡献者。我经常在世界各地的各种会议以及技术聚会上演讲Netty。最终Netty开启了另一个在苹果公司的就业机会,我目前在云基础设施工程团队(Cloud Infrastructure Engineering Team)担任资深软件工程师。我继续致力于Netty,并且经常贡献回馈社区,同时也帮助推动该项目。

Norman Maurer

苹果公司,云基础设施工程

 

我在马萨诸塞州韦斯顿的Harvard Pilgrim Health Care担任Dell Services的顾问时,就主要侧重于构建可复用的基础设施组件。我们的目标是找到这样一种扩展通用代码库的方式:它不仅对通常的软件过程有利,而且还能将应用程序开发者从编写既麻烦又平凡的管道代码(plumbing code)的责任中解脱出来。

我一度发现,有两个相关的项目都在使用一个第三方的理赔处理系统,该系统只支持直接的TCP/IP通信。其中一个项目需要使用Java重新实现一个文档不太详细的构建在供应商的专有的基于分隔的格式上的遗留COBAL模块。这个模块最终被另一个项目取代了,那个项目将使用较新的基于XML的接口来连接到该相同理赔系统上。(但是使用的仍然是裸套接字,而不是SOAP!)

在我看来,这是一个理想的开发一个通用API的机会,而且也充满了乐趣。我知道将会有严格的吞吐量和可靠性要求,并且设计也仍然在不断地演进。显然,为了支持快速的迭代周期,底层的网络代码必须完全和业务逻辑解耦。

我对于Java的高性能网络编程框架的调研把我直接带到了Netty面前。(在第1章开头读者会读到一个假设的项目,它其实基本上取材自现实生活。)我很快就确信了Netty的方式,使用可动态配置的编码器和解码器,能够完美地满足我们的需求:两个项目将可以使用相同的API,并部署所使用的特定数据格式所需的处理器。在我发现该供应商的产品也是基于Netty的之后,我变得更加坚信了!

就在那时,我得知有一本我一直都在期待的叫《Netty实战》的书正在编写中。我读了早期的书稿,并带着一些问题和建议很快和Norman取得了联系。在我们多次的交流过程中,我们常常会谈到要记住最终用户的视角,而且因为我当时正在参与一个实实在在的Netty项目,所以我很高兴地担当了这个(合著者/最终用户)角色。

我希望,通过这种方式,我们能够成功地满足开发者们的需求。如果您有任何关于我们如何能够使得本书变得更加有用的建议,请在https://forums.manning.com/forums/netty-in-action联系我们。

Marvin Allen Wolfthal

Dell Services

致谢

感谢那些帮助校审本书的人们,不管是通过阅读那些早期版本的章节并在Author Online论坛张贴勘误的,还是通过在本书编写的各个阶段校审书稿的。你们是本书的一部分,应该感到自豪。没有你们,这本书将不可能会像现在这样。特别地感谢下面的这些审阅者们:Achim Friedland、Arash Bizhan Zadeh、Bruno Georges、Christian Bach、Daniel Beck、Declan Cox、Edward Ribeiro、Erik Onnen、Francis Marchi、Gregor Zurowski、Jian Jin、Jürgen Hoffmann、Maksym Prokhorenko、Nicola Grigoletti、Renato Felix和Yestin Johnson。同样也感谢我们优秀的技术校对:David Dossot和Neil Rutherford。

我们非常感激并且由衷地感谢Bruno de Carvalho、Sara Robinson、Greg Soltis、Erik Onnen、Andrew Cox以及Jeff Smick,他们贡献了第14章和第15章的案例研究。

最后但并非最不重要,感谢所有支持Netty以及开源项目的人们,没有你们和社区,就不可能有这个项目。通过社区,我们得以结识新朋友、在世界各地的会议上讨论,并且同时获得了专业和个人方面的成长。

Norman Maurer

我想要感谢我的前同事也是朋友Jürgen Hoffmann(也叫Buddy)。Jürgen帮助我找到了我进入开源世界的道路,并且向我展示了当你拥有足够的勇气参与时,你将能构建出多么酷的东西。如果没有他,我可能永远也不会接触到编程,也因此不会发现我真正的专业激情所在。

另外,要非常地感谢我的朋友Trustin Lee——Netty的创始人,最初是他帮助并且鼓励了我为Netty项目做贡献,还为我们的书作序。我很荣幸能够认识你并能够和你成为朋友!我相信通过继续一起工作,Netty将继续令人惊叹并长久存在!

我还想感谢我的合著者Marvin Wolfthal。尽管Marvin在该项目的后期才加入,但他帮助我极大地提高了整体的结构和内容。没有他,这本书不可能有现在的样子。这让我想到了Manning团队本身,他们总是能够给予帮助和正确的指引,使得编写一本书的想法成为现实。

感谢我的父母Peter和Christa一直以来支持我以及我的想法。

最要感谢的是我的妻子Jasmina以及我的孩子们Mia Soleil和Ben,感谢他们在我编写这本书的过程中所给予的支持。没有你们就不可能有这本书。

Marvin Wolfthal

首先,我要感谢我的合著者Norman Maurer,感谢他出色的工作以及他的友善。虽然我加入该项目的时间比较晚,但他依然让我感觉好像是从第一天开始就成为了它的一部分似的。

对于我过去和现在在Dell Services以及Harvard Pilgrim Health Care的同事们,我衷心地感谢他们的帮助及鼓励。他们创造了不可多得的环境,在那里,不仅可以表达新的想法,而且还能将其筑成现实。致Deborah Norton、Larry Rapisarda、Dave Querusio、Vijay Bhatt、Craig Bogovich以及Sharath Krishna,特别要感谢的是他们的支持,以及更难得的是他们的信任——我相信没有多少软件开发者能够被给予我在过去4年里所享受到的创造性的机会,包括将Netty引入到我们的工具集中。

但最重要的是,感谢我心爱的妻子Katherine,她让我永远不会忘记那些真正重要的东西。

关于本书

Netty不只是一个接口和类的集合;它还定义了一种架构模型以及一套丰富的设计模式。但是直到现在,依然缺乏一个全面的、系统性的用户指南,已经成为入门Netty的一个障碍,这种情况也是本书旨在改变的。除了解释该框架的组件以及API的详细信息之外,本书还会展示Netty如何能够帮助开发人员编写更高效的、可复用的、可维护的代码。

谁应该阅读本书

本书假定读者熟悉中等级别的Java主题,如泛型和多线程处理。不要求有高级网络编程的经验,但是熟悉基本的Java网络编程API将大有裨益。

Netty使用Apache Maven作为它的构建管理工具。如果读者还未使用过Maven,那么附录将会为读者提供运行本书示例代码所需要的信息。读者也可以复用这些示例的Maven配置,作为自己的基于Netty的项目的起点。

导读

本书共分4个部分,且有一个附录。

第一部分:Netty的概念及体系结构

第一部分是对框架的详细介绍,涵盖了它的设计、组件以及编程接口。

第1章首先简要概述了阻塞和非阻塞的网络API,以及它们对应的JDK接口。我们引入Netty作为构建高度可伸缩的、异步的、事件驱动的网络编程应用的工具包。我们将首先看一下该框架的基础构件块:Channel、回调、Future、事件及ChannelHandler

第2章解释了如何配置读者的系统以构建并运行本书中的示例代码。我们将用一个简单的应用程序来测试它,这是一个回送从连接的客户端接收到的消息的服务器应用程序。我们还介绍了引导(Bootstrap)——在运行时组装和配置一个应用程序的所有组件的过程。

第3章首先讨论了Netty的技术以及体系结构方面的内容。介绍了该框架的核心组件:ChannelEventLoopChannelHandler以及ChannelPipeline。这一章的最后解释了引导服务器和客户端之间的差异。

第4章讨论了网络传输,并且对比了通过JDK API和Netty使用阻塞和非阻塞传输的用法。我们研究了Netty的传输API的底层接口的层级关系以及它们所支持的传输类型。

第5章专门介绍了该框架的数据处理API——ByteBuf,Netty的字节容器。我们描述了它相对于JDK的ByteBuffer的优势,以及如何分配和访问由ByteBuf所使用的内存。我们展示了如何通过引用计数来管理内存资源。

第6章重点介绍了核心组件ChannelHandlerChannelPipeline,它们负责调度应用程序的处理逻辑,并驱动数据和事件经过网络层。其他的主题包括在实现高级用例时ChannelHandlerContext的角色, 以及在多个ChannelPipeline之间共享ChannelHandler的缘由。这一章的最后说明了如何处理由入站事件和出站事件所触发的异常。

第7章提供了关于线程模型的一般概述,并详细地介绍了Netty的线程模型。我们研究了interface EventLoop,它是Netty的并发API的主要部分,并解释了它和线程以及Channel的关系。这个信息对于理解Netty是如何实现异步的、事件驱动的网络编程模型来说至关重要。我们展示了如何通过EventLoop进行任务调度。

第8章以介绍Bootstrap类的层级结构作为引子,深入地讲解了引导。我们重新审视了一些基本用例以及一些特殊用例,例如,在一个服务器应用程序中引导一个客户端连接、引导数据报Channel,以及在引导的过程中添加多个ChannelHandler。这一章最后讨论了如何优雅地关闭应用程序并有序地释放所有的资源。

第9章是关于对ChannelHandler进行单元测试的讨论,对此Netty提供了一个特殊的Channel实现——EmbeddedChannel。本章的示例展示了如何使用这个类和JUnit一起来测试入站和出站ChannelHandler实现。

第二部分:编解码器

数据转换是网络编程中最常见的操作之一。第二部分介绍了Netty提供的用于简化这一任务的丰富的工具集。

第10章首先解释了解码器和编码器,它们将字节序列从一种格式转换为另外一种格式。一个无处不在的例子便是将一个非结构化的字节流转换为一个特定于协议的布局结构,或者相反的。编解码器则是一个结合了编码器以及解码器以处理双向转换的组件。我们提供了几个例子,展示了通过Netty的编解码器框架类创建自定义的解码器以及编码器是多么地容易。

第11章研究了Netty提供的用于各种用例的编解码器以及ChannelHandler。这些类包括用于协议的(如SSL/TLS、HTTP/HTTPS、WebSocket以及SPDY)即用型的编解码器,以及能够通过扩展来处理几乎任意的基于分隔符的协议、变长协议或者定长协议的解码器。这一章的最后介绍了用于写入大型数据的和用于序列化的框架组件。

第三部分:网络协议

第三部分详细阐述了几种本书前面简要介绍过的网络协议。我们将会再次看到Netty是如何使你能在自己的应用程序中轻松采用复杂的API,而又不必关心其内部复杂性的。

第12章展示了如何使用WebSocket协议来实现Web服务器和客户端之间的双向通信。示例程序是一个聊天室服务器,其允许所有已连接的用户与其他已连接的用户进行实时通信。

第13章通过利用了用户数据报协议(UDP)的广播能力的服务器和客户端应用程序,说明了Netty对于无连接协议的支持。如同前面的那些示例一样,我们使用了一组特定于协议的支持类:DatagramPacketNioDatagramChannel

第四部分:案例研究

第四部分介绍了由使用Netty实现了任务关键型系统的知名公司提交的5份案例研究。这些案例不仅说明了我们在整本书中所讨论过的框架各个组件在现实世界中的应用,而且还演示了Netty的设计以及架构原则,在构建高度可伸缩和可扩展的应用程序方面的应用。

第14章有Droplr、Firebase以及Urban Airship提交的案例研究。

第15章有Facebook和Twitter提交的案例研究。

附录:Maven介绍

该附录的主要目的是提供一个对于Apache Maven的基本介绍,以便读者可以编译和运行本书的示例代码清单,并在开始使用Netty时扩展它们来创建自己的项目。

介绍了以下主题:

  • Maven的主要目标和用途;
  • 安装以及配置Maven;
  • Maven的基本概念——POM文件、构件、坐标、依赖、插件及存储库;
  • Maven配置的示例,POM的继承以及聚合;
  • Maven的命令行语法。

代码约定和下载

这本书提供了丰富的示例,说明了如何利用每个涵盖的主题。为了将代码和普通文本区分开,代码清单或者正文中的代码都是以等宽字体(如fixed-width font like this)显示的。此外,正文中的类和方法名、对象属性以及其他代码相关的术语和内容也都以等宽字体呈现。

偶尔,代码是斜体的,如reference.dump()。在这种情况下,不要逐字输入reference,要把它替换为所需的内容。

本书的源代码可以从出版商的网站www.manning.com/books/netty-in-action以及GitHub的项目地址 https://github.com/normanmaurer/netty-in-action获取[1]。我们将源代码构造成了一个多模块的Maven项目,其中包含一个顶级POM和多个对应于本书各章的模块。

关于作者

Norman Maurer[2]是Netty的核心开发人员之一,Apache软件基金会的一员。在过去的几年,他还是很多开源项目的贡献者。他是Apple公司的一名资深软件工程师,Netty和其他网络相关的项目是他在iCloud团队的工作内容。

Marvin Wolfthal[3]作为开发者、架构师、讲师和作者一直活跃在多个软件开发领域。他很早就开始使用Java,并且协助Sun开发了它第一批致力于促进分布式对象技术的程序。作为这些努力的一部分,他使用C++、Java和CORBA为Sun Education编写了第一套跨语言的编程课程。从那时起,他的主要关注点就一直是中间件的设计和开发,主要针对金融行业。他目前是Dell Services的一名顾问,致力于将Java世界中产生的方法论拓展到其他的企业计算领域中,例如,将持续集成的实践应用到数据库的开发中。Marvin还是钢琴家和作曲家,他的作品已由维也纳的Universal Edition公司发行[4]。他和他的妻子凯瑟琳以及他们的3只猫伙伴Fritz、Willy和Robbie住在马萨诸塞州的韦斯顿。

作者在线

购买本书的读者可以免费访问Manning出版社运营的一个私有Web论坛[5],在那里,可以评论本书、提技术问题,还可以获得作者和其他用户的帮助。如果要访问或者订阅该论坛,可以用Web浏览器访问www.manning.com/books/netty-in-action。这个页面提供了以下信息:注册之后如何访问论坛;可以获得什么样的帮助;该论坛的一些行为准则;本书示例的源代码的链接、勘误表以及其他的下载资源。

Manning承诺为我们的读者提供一个交流场所,在那里读者之间以及读者和作者之间可以进行有意义的对话。但是对于作者方面的参与并没有做任何数量上的承诺,作者对于作者在线(AO)的贡献仍然是自愿的(和无偿的)。我们建议你向作者提一些富有挑战性的问题,以免他们没兴趣回答!

只要这本书尚未绝版,就可以从出版社的网站上访问到作者在线论坛以及之前讨论的存档。


[1] 本书中文版的源代码可以从GitHub的项目地址href=’https://github.com/ReactivePlatform/netty-in-action-cn获取,也可以在异步社区(www.epubit.com.cn)本书页面下载。——译者注

[2] Norman Maurer的个人网站是http://normanmaurer.me/,在这里可以找到更多关于Netty的讨论。——译者注

[3] Marvin Wolfthal的个人网站是http://www.weichi.com/maw/。——译者注

[4] 唱片的在线试听地址是http://www.universaledition.com/composers-and-works/Marvin-Wolfthal/composer/4038。——译者注

[5] 本书中文版的读者也可以访问本书在异步社区的相应页面。——译者注

关于封面插图

自那以后,服饰的风格已然发生了变化,当时各地如此丰富多样的风格已经逐渐消失。现在已经很难分辨不同大洲的居民,更别说区分不同城镇或者地区的居民了。也许我们使用文化的多样性换取了更加多样化的个人生活——当然也是更加多样化和快节奏的科技生活。

在很难将一本计算机图书与另一本区分开的时代,Manning通过使用基于两个世纪以前的多样化的区域生活的图书封面,让作品集中的插画重现于世,比如这一幅,借以来赞美计算机行业的创造力和进取精神。

 

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Netty实战》Netty In Action中文版——文前内容

  • Trackback 关闭
  • 评论 (0)
  1. 暂无评论

return top