编辑推荐

  

  -Netty之父”TrustinLee作序推荐
  -阿里巴巴中间件高级技术专家为《Netty实战》中文版作序推荐
  -系统而详细地介绍了Netty的各个方面并附带了即用型的优质示例
  -附带行业一线公司的案例研究
  -极实用的Netty技术书
  无论是构建高性能的Web、游戏服务器、推送系统、RPC框架、消息中间件还是分布式大数据处理引擎,都离不开Netty,在整个行业中,Netty广泛而成功的应用,使其成为了Java高性能网络编程的卓绝框架。
  Netty的现TechLeadNorman在《Netty实战》中循序渐进地讲解了Netty的各个关键部分,在看完《Netty实战》后,你不但可以熟练地使用Netty来构建以上系统,并且还可以避免很多常见的陷阱。
  无论是想要学习Spring5、Spark、Cassandra等这样的系统,还是通过学习Netty来构建自己的基于Java的高性能网络框架,或者是更加具体的高性能Web或者游戏服务器等,《Netty实战》都将是你的超强拍档。
  《Netty实战》中文版基于Netty4.1.9做了修订,希望《Netty实战》能够给你带来一个接近完美的阅读体验,并能帮到你。
  
  

内容简介

  《Netty实战》是为想要或者正在使用Java从事高性能网络编程的人而写的,循序渐进地介绍了Netty各个方面的内容。
  《Netty实战》共分为4个部分:第一部分详细地介绍Netty的相关概念以及核心组件,第二部分介绍自定义协议经常用到的编解码器,第三部分介绍Netty对于应用层高级协议的支持,会覆盖常见的协议及其在实践中的应用,第四部分是几个案例研究。此外,附录部分会还简单地介绍Maven,以及如何通过使用Maven编译和运行《Netty实战》中的示例。
  阅读《Netty实战》不需要读者精通Java网络和并发编程。如果想要更加深入地理解《Netty实战》背后的理念以及Netty源码本身,可以系统地学习一下Java网络编程、NIO、并发和异步编程以及相关的设计模式。

作者简介

  NormanMaurer,是苹果公司的资深软件工程师,同时也是Netty的核心开发人员。

  MarvinAllenWolfthal,是DellServices的顾问,他使用Netty实现了多个任务关键型的企业系统。

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

目录

第一部分Netty的概念及体系结构
第1章Netty——异步和事件驱动3
1.1Java网络编程4
1.1.1JavaNIO5
1.1.2选择器6
1.2Netty简介6
1.2.1谁在使用Netty7
1.2.2异步和事件驱动8
1.3Netty的核心组件9
1.3.1Channel9
1.3.2回调9
1.3.3Future10
1.3.4事件和ChannelHandler11
1.3.5把它们放在一起12
1.4小结13
第2章你的第一款Netty应用程序14
2.1设置开发环境14
2.1.1获取并安装Java开发工具包14
2.1.2下载并安装IDE15
2.1.3下载和安装ApacheMaven15
2.1.4配置工具集16
2.2Netty客户端/服务器概览16
2.3编写Echo服务器17
2.3.1ChannelHandler和业务逻辑17
2.3.2引导服务器18
2.4编写Echo客户端21
2.4.1通过ChannelHandler实现客户端逻辑21
2.4.2引导客户端22
2.5构建和运行Echo服务器和客户端24
2.5.1运行构建24
2.5.2运行Echo服务器和客户端27
2.6小结29
第3章Netty的组件和设计30
3.1Channel、EventLoop和ChannelFuture30
3.1.1Channel接口31
3.1.2EventLoop接口31
3.1.3ChannelFuture接口32
3.2ChannelHandler和ChannelPipeline32
3.2.1ChannelHandler接口32
3.2.2ChannelPipeline接口33
3.2.3更加深入地了解ChannelHandler34
3.2.4编码器和解码器35
3.2.5抽象类SimpleChannelInboundHandler35
3.3引导36
3.4小结37
第4章传输38
4.1案例研究:传输迁移38
4.1.1不通过Netty使用OIO和NIO39
4.1.2通过Netty使用OIO和NIO41
4.1.3非阻塞的Netty版本42
4.2传输API43
4.3内置的传输45
4.3.1NIO——非阻塞I/O46
4.3.2Epoll——用于Linux的本地非阻塞传输47
4.3.3OIO——旧的阻塞I/O48
4.3.4用于JVM内部通信的Local传输48
4.3.5Embedded传输49
4.4传输的用例49
4.5小结51
第5章ByteBuf52
5.1ByteBuf的API52
5.2ByteBuf类——Netty的数据容器53
5.2.1它是如何工作的53
5.2.2ByteBuf的使用模式53
5.3字节级操作57
5.3.1随机访问索引57
5.3.2顺序访问索引57
5.3.3可丢弃字节58
5.3.4可读字节58
5.3.5可写字节59
5.3.6索引管理59
5.3.7查找操作60
5.3.8派生缓冲区60
5.3.9读/写操作62
5.3.10更多的操作64
5.4ByteBufHolder接口65
5.5ByteBuf分配65
5.5.1按需分配:ByteBufAllocator接口65
5.5.2Unpooled缓冲区67
5.5.3ByteBufUtil类67
5.6引用计数67
5.7小结68
第6章ChannelHandler和ChannelPipeline70
6.1ChannelHandler家族70
6.1.1Channel的生命周期70
6.1.2ChannelHandler的生命周期71
6.1.3ChannelInboundHandler接口71
6.1.4ChannelOutboundHandler接口73
6.1.5ChannelHandler适配器74
6.1.6资源管理74
6.2ChannelPipeline接口76
6.2.1修改ChannelPipeline78
6.2.2触发事件79
6.3ChannelHandlerContext接口80
6.3.1使用ChannelHandlerContext82
6.3.2ChannelHandler和ChannelHandlerContext的高级用法84
6.4异常处理86
6.4.1处理入站异常86
6.4.2处理出站异常87
6.5小结88
第7章EventLoop和线程模型89
7.1线程模型概述89
7.2EventLoop接口90
7.2.1Netty4中的I/O和事件处理92
7.2.2Netty3中的I/O操作92
7.3任务调度93
7.3.1JDK的任务调度API93
7.3.2使用EventLoop调度任务94
7.4实现细节95
7.4.1线程管理95
7.4.2EventLoop/线程的分配96
7.5小结98
第8章引导99
8.1Bootstrap类99
8.2引导客户端和无连接协议101
8.2.1引导客户端102
8.2.2Channel和EventLoopGroup的兼容性103
8.3引导服务器104
8.3.1ServerBootstrap类104
8.3.2引导服务器105
8.4从Channel引导客户端107
8.5在引导过程中添加多个ChannelHandler108
8.6使用Netty的ChannelOption和属性110
8.7引导DatagramChannel111
8.8关闭112
8.9小结112
第9章单元测试113
9.1EmbeddedChannel概述113
9.2使用EmbeddedChannel测试ChannelHandler115
9.2.1测试入站消息115
9.2.2测试出站消息118
9.3测试异常处理119
9.4小结121
第二部分编解码器
第10章编解码器框架125
10.1什么是编解码器125
10.2解码器125
10.2.1抽象类ByteToMessageDecoder126
10.2.2抽象类ReplayingDecoder127
10.2.3抽象类MessageToMessageDecoder128
10.2.4TooLongFrameException类130
10.3编码器131
10.3.1抽象类MessageToByteEncoder131
10.3.2抽象类MessageToMessageEncoder132
10.4抽象的编解码器类133
10.4.1抽象类ByteToMessageCodec133
10.4.2抽象类MessageToMessageCodec134
10.4.3CombinedChannelDuplexHandler类137
10.5小结138
第11章预置的ChannelHandler和编解码器139
11.1通过SSL/TLS保护Netty应用程序139
11.2构建基于Netty的HTTP/HTTPS应用程序141
11.2.1HTTP解码器、编码器和编解码器141
11.2.2聚合HTTP消息143
11.2.3HTTP压缩144
11.2.4使用HTTPS145
11.2.5WebSocket146
11.3空闲的连接和超时148
11.4解码基于分隔符的协议和基于长度的协议150
11.4.1基于分隔符的协议150
11.4.2基于长度的协议153
11.5写大型数据155
11.6序列化数据157
11.6.1JDK序列化157
11.6.2使用JBossMarshalling进行序列化157
11.6.3通过ProtocolBuffers序列化159
11.7小结160
第三部分网络协议
第12章WebSocket163
12.1WebSocket简介163
12.2我们的WebSocket示例应用程序164
12.3添加WebSocket支持165
12.3.1处理HTTP请求165
12.3.2处理WebSocket帧168
12.3.3初始化ChannelPipeline169
12.3.4引导171
12.4测试该应用程序173
12.5小结176
第13章使用UDP广播事件177
13.1UDP的基础知识177
13.2UDP广播178
13.3UDP示例应用程序178
13.4消息POJO:LogEvent179
13.5编写广播者180
13.6编写监视器185
13.7运行LogEventBroadcaster和LogEventMonitor187
13.8小结189
第四部分案例研究
第14章案例研究,第一部分193
14.1Droplr—构建移动服务193
14.1.1这一切的起因193
14.1.2Droplr是怎样工作的194
14.1.3创造一个更加快速的上传体验194
14.1.4技术栈196
14.1.5性能199
14.1.6小结——站在巨人的肩膀上200
14.2Firebase—实时的数据同步服务200
14.2.1Firebase的架构201
14.2.2长轮询201
14.2.3HTTP1.1keep-alive和流水线化204
14.2.4控制SslHandler205
14.2.5Firebase小结207
14.3UrbanAirship—构建移动服务207
14.3.1移动消息的基础知识207
14.3.2第三方递交208
14.3.3使用二进制协议的例子209
14.3.4直接面向设备的递交211
14.3.5Netty擅长管理大量的并发连接212
14.3.6UrbanAirship小结——跨越防火墙边界213
14.4小结214
第15章案例研究,第二部分215
15.1Netty在Facebook的使用:Nifty和Swift215
15.1.1什么是Thrift215
15.1.2使用Netty改善JavaThrift的现状216
15.1.3Nifty服务器的设计217
15.1.4Nifty异步客户端的设计220
15.1.5Swift:一种更快的构建JavaThrift服务的方式221
15.1.6结果221
15.1.7Facebook小结224
15.2Netty在Twitter的使用:Finagle224
15.2.1Twitter成长的烦恼224
15.2.2Finagle的诞生224
15.2.3Finagle是如何工作的225
15.2.4Finagle的抽象230
15.2.5故障管理231
15.2.6组合服务232
15.2.7未来:Netty232
15.2.8Twitter小结233
15.3小结233
附录Maven介绍234

前言/序言

  前言
  回首过去,我仍然不敢相信我做到了。
  当我从2011年年末开始为Netty做贡献时,我怎么也想不到我会写一本关于Netty的书,并且成为该框架本身的核心开发者之一。
  这一切都始于我在2009年参与的ApacheJames项目,一个在Apache软件基金会下开发的基于Java的邮件服务器。
  像许多应用程序一样,ApacheJames需要构建在一个坚实的网络抽象之上。在考察提供网络抽象的项目领域时,我偶然地发现了Netty,并且立即就爱上了它。在我从用户的角度更加地熟悉了Netty之后,我便开始转向改进它和回馈社区。
  尽管我第一次贡献的范围有限,但是很快变得明显的是,进行贡献以及和社区进行相关问题的讨论,尤其是和项目的创始人TrustinLee,对于我的个人成长非常有益。这样的经验牢牢地吸引了我,我喜欢将我的空闲时间更多地投入到社区中。我在邮件列表上提供帮助,并且加入了IRC频道的讨论。致力于Netty开始是一种爱好,但很快就演变成了一种激情。
  我对Netty的激情最终导致我在RedHat就业。这简直是美梦成真,因为RedHat雇佣我来致力于我所热爱的项目。我最终知道了ClausIbsen在那时正(现在仍然)致力于ApacheCamel。Claus和我认识到,虽然Netty拥有坚实的用户基础以及良好的JavaDoc,但是它缺乏一个更加高级别的文档。Claus是《CamelinAction》(Manning,2010)的作者,他给了我为Netty写一本类似的书的想法。关于这个想法,我考虑了几个星期,最终接受了。这也就有了《Netty实战》。
  在编写《Netty实战》的过程中,我也越来越多地参与到了社区中。伴随着超过1000次的提交①,我最终成为了仅次于TrustinLee的最活跃的贡献者。我经常在世界各地的各种会议以及技术聚会上演讲Netty。最终Netty开启了另一个在苹果公司的就业机会,我目前在云基础设施工程团队(CloudInfrastructureEngineeringTeam)担任资深软件工程师。我继续致力于Netty,并且经常贡献回馈社区,同时也帮助推动该项目。
  NormanMaurer
  苹果公司云基础设施工程
  我在马萨诸塞州韦斯顿的HarvardPilgrimHealthCare担任DellServices的顾问时,就主要侧重于构建可复用的基础设施组件。我们的目标是找到这样一种扩展通用代码库的方式:它不仅对通常软件过程有利,而且还能将应用程序开发者从编写既麻烦又平凡的管道代码(plumbingcode)责任中解脱出来。
  我一度发现,有两个相关的项目都在使用一个第三方的理赔处理系统,该系统只支持直接的CP/IP通信。其中一个项目需要使用Java重新实现一个文档不太详细的构建在供应商的专有的基于分隔的格式上的遗留COBAL模块。这个模块最终被另一个项目取代了,那个项目将使用较新的基于XML的接口来连接到该相同理赔系统上。(但是使用的仍然是裸套接字,而不是SOAP!)在我看来,这是一个理想的开发一个通用API的机会,而且也充满了乐趣。我知道将会有严格的吞吐量和可靠性要求,并且设计也仍然在不断地演进。显然,为了支持快速的迭代周期,底层的网络代码必须完全和业务逻辑解耦。
  我对于Java的高性能网络编程框架的调研把我直接带到了Netty面前。(在第1章开头读者会读到一个假设的项目,它其实基本上取材自现实生活。)我很快就确信了Netty的方式,使用可动态配置的编码器和解码器,能够完美地满足我们的需求:两个项目将可以使用相同的API,并部署所使用的特定数据格式所需的处理器。在我发现该供应商的产品也是基于Netty的之后,我变得更加坚信了!
  就在那时,我得知有一本我一直都在期待的叫《Netty实战》的书正在编写中。我读了早期的草稿,并带着一些问题和建议很快和Norman取得了联系。在我们多次的交流过程中,我们常常会谈到要记住最终用户的视角,而且因为我当时正在参与一个实实在在的Netty项目,所以我很高兴地担当了这个(合著者/最终用户)角色。
  我希望,通过这种方式,我们能够成功地满足开发者们的需求。如果您有任何关于我们如何能够使得《Netty实战》变得更加有用的建议,请在https://forums.manning.com/forums/netty-in-action联系我们。
  MarvinAllenWolfthal
  DellServices


其他推荐