Netty是一款用于快速开发高性能的网络应用程序的Java框架。它封装了网络编程的复杂性,使网络编程和Web技术的最新进展能够被比以往更广泛的开发人员接触到。
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的技术以及体系结构方面的内容。介绍了该框架的核心组件:Channel
、EventLoop
、ChannelHandler
以及ChannelPipeline
。这一章的最后解释了引导服务器和客户端之间的差异。
第4章讨论了网络传输,并且对比了通过JDK API和Netty使用阻塞和非阻塞传输的用法。我们研究了Netty的传输API的底层接口的层级关系以及它们所支持的传输类型。
第5章专门介绍了该框架的数据处理API——ByteBuf
,Netty的字节容器。我们描述了它相对于JDK的ByteBuffer
的优势,以及如何分配和访问由ByteBuf
所使用的内存。我们展示了如何通过引用计数来管理内存资源。
第6章重点介绍了核心组件ChannelHandler
和ChannelPipeline
,它们负责调度应用程序的处理逻辑,并驱动数据和事件经过网络层。其他的主题包括在实现高级用例时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对于无连接协议的支持。如同前面的那些示例一样,我们使用了一组特定于协议的支持类:DatagramPacket
和NioDatagramChannel
。
第四部分:案例研究
第四部分介绍了由使用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] 本书中文版的读者也可以访问本书在异步社区的相应页面。——译者注