Netty权威指南

Netty权威指南(异步非阻塞通信领域的经典之作,国内首本深入剖析Netty的著作,全面系统讲解原理、实战和源码,带你完美进阶Netty工程师。

李林锋 著  

ISBN 978-7-121-23343-2

2014年6月出版

定价:79.00元

524页

16开

编辑推荐

- 资深一线专家诚意之作,总结多年实践经验,带你全面掌握Java高并发异步通信的首选框架——Netty。

- Facebook、阿里巴巴、1号店、并发编程网、JBoss等多位资深技术专家联名力荐。

《Netty权威指南》是异步非阻塞通信领域的经典之作,是国内首本深入分析和讲解Netty原理和架构的著作,内容包含基础功能、高级应用、系统架构、源码分析和行业应用,深入阐述了Java I/O的Netty NIO开发、Netty编解码开发、Netty多协议开发等各方面的技术要点,包含了对源码的深刻解读,并且对Netty的应用现状和未来趋势进行分析,旨在帮助从业人员提升自我,更快更明确地发展职业道路。

Netty是什么?使用Netty能够做什么?为什么要从传统的Socket开发切换到NIO进行编程?为什么不直接基于JDK的NIO类库编程而选择Netty?如何全面系统地掌握Netty,进行Netty NIO开发、Netty编解码开发、Netty多协议开发?如何通过对Netty源码的学习获得更深入地知识?掌握了Netty后,如何将其应用到实际架构中?Netty工程师的就业前景和可涉足的行业是怎样的?本书都会一一解答。

内容提要

《Netty权威指南》是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和核心类库的设计原理,而且对Netty在大数据、互联网、游戏行业的应用进行了深入分析;实战方面,从第一个Netty入门程序到私有协议栈的设计和开发,通过实际例程,由浅入深地对Netty的核心API和类库的功能和用法进行了细致讲解。

《Netty权威指南》适合架构师、设计师、软件开发工程师、测试人员和其他对Java NIO框架、Java通信感兴趣的相关人士阅读,相信通过学习《Netty权威指南》,能够熟悉和掌握Netty这一优秀的异步通信框架,实现高可用分布式系统的构建。

目录

基础篇  走进Java NIO

第1章  Java的I/O演进之路     2

1.1  I/O基础入门     3

1.1.1  Linux网络I/O模型简介     3

1.1.2  I/O多路复用技术     6

1.2  Java的I/O演进     8

1.3  总结     10

第2章  NIO入门     11

2.1  传统的BIO编程     11

2.1.1  BIO通信模型图     12

2.1.2  同步阻塞式I/O创建的TimeServer源码分析     13

2.1.3  同步阻塞式I/O创建的TimeClient源码分析     16

2.2  伪异步I/O编程     18

2.2.1  伪异步I/O模型图     19

2.2.2  伪异步式I/O创建的TimeServer源码分析     19

2.2.3  伪异步I/O弊端分析     21

2.3  NIO编程     24

2.3.1  NIO类库简介     24

2.3.2  NIO服务端序列图     28

2.3.3  NIO创建的TimeServer源码分析     31

2.3.4  NIO客户端序列图     36

2.3.5  NIO创建的TimeClient源码分析     39

2.4  AIO编程     45

2.4.1  AIO创建的TimeServer源码分析     46

2.4.2  AIO创建的TimeClient源码分析     52

2.4.3  AIO版本时间服务器运行结果     56

2.5  4种I/O的对比     58

2.5.1  概念澄清     58

2.5.2  不同I/O模型对比     60

2.6  选择Netty的理由     60

2.6.1  不选择Java原生NIO编程的原因     61

2.6.2  为什么选择Netty  62

2.7  总结     63

入门篇  Netty NIO开发指南

第3章  Netty入门应用     66

3.1  Netty开发环境的搭建     66

3.1.1  下载Netty的软件包     67

3.1.2  搭建Netty应用工程     67

3.2  Netty服务端开发     68

3.3  Netty客户端开发     73

3.4  运行和调试     76

3.4.1  服务端和客户端的运行     76

3.4.2  打包和部署     77

3.5  总结     78

第4章  TCP粘包/拆包问题的解决之道     79

4.1  TCP粘包/拆包     79

4.1.1  TCP粘包/拆包问题说明     80

4.1.2  TCP粘包/拆包发生的原因     80

4.1.3  粘包问题的解决策略     81

4.2  未考虑TCP粘包导致功能异常案例     82

4.2.1  TimeServer的改造     82

4.2.2  TimeClient的改造     83

4.2.3  运行结果     84

4.3  利用LineBasedFrameDecoder解决TCP粘包问题     88

4.3.1  支持TCP粘包的TimeServer  88

4.3.2  支持TCP粘包的TimeClient  90

4.3.3  运行支持TCP粘包的时间服务器程序     93

4.3.4  LineBasedFrameDecoder和StringDecoder的原理分析     98

4.4  总结     99

第5章  分隔符和定长解码器的应用     100

5.1 DelimiterBasedFrameDecoder应用开发     101

5.1.1 DelimiterBasedFrameDecoder服务端开发     101

5.1.2 DelimiterBasedFrameDecoder客户端开发     104

5.1.3  运行DelimiterBasedFrameDecoder服务端和客户端     106

5.2  FixedLengthFrameDecoder应用开发     108

5.2.1  FixedLengthFrameDecoder服务端开发     108

5.2.2  利用telnet命令行测试EchoServer服务端     110

5.3  总结     111

中级篇  Netty编解码开发指南

第6章  编解码技术     114

6.1  Java序列化的缺点     115

6.1.1  无法跨语言     115

6.1.2  序列化后的码流太大     115

6.1.3  序列化性能太低     118

6.2  业界主流的编解码框架     121

6.2.1  Google的Protobuf介绍     121

6.2.2  Facebook的Thrift介绍     123

6.2.3  JBoss Marshalling介绍     124

6.3  总结     125

第7章  Java序列化     126

7.1  Netty Java序列化服务端开发     126

7.2  Java序列化Netty客户端开发     132

7.3  运行结果     135

7.4  总结     137

第8章  Google Protobuf编解码     138

8.1  Protobuf的入门     139

8.1.1  Protobuf开发环境搭建     139

8.1.2  Protobuf编解码开发     141

8.1.3  运行Protobuf例程     143

8.2  Netty的Protobuf服务端开发     143

8.2.1  Protobuf版本的图书订购服务端开发     144

8.2.2  Protobuf版本的图书订购客户端开发     146

8.2.3  Protobuf版本的图书订购程序功能测试     149

8.3  Protobuf的使用注意事项     152

8.4  总结     153

第9章  JBoss Marshalling编解码     154

9.1  Marshalling开发环境准备     154

9.2  Netty的Marshalling服务端开发     155

9.3  Netty的Marshalling客户端开发     158

9.4  运行Marshalling客户端和服务端例程     160

9.5  总结     162

高级篇  Netty多协议开发和应用

第10章  HTTP协议开发应用     164

10.1  HTTP协议介绍     165

10.1.1  HTTP协议的URL  165

10.1.2  HTTP请求消息(HttpRequest)     165

10.1.3  HTTP响应消息(HttpResponse)     168

10.2  Netty HTTP服务端入门开发     169

10.2.1  HTTP服务端例程场景描述     170

10.2.2  HTTP服务端开发     170

10.2.3  Netty HTTP文件服务器例程运行结果     178

10.3  Netty HTTP+XML协议栈开发     182

10.3.1  开发场景介绍     183

10.3.2  HTTP+XML协议栈设计     186

10.3.3  高效的XML绑定框架JiBx  187

10.3.4  HTTP+XML编解码框架开发     195

10.3.5  HTTP+XML协议栈测试     211

10.3.6  小结     213

10.4  总结     214

第11章  WebSocket协议开发     215

11.1  HTTP协议的弊端     216

11.2  WebSocket入门     216

11.2.1  WebSocket背景     217

11.2.2  WebSocket连接建立     218

11.2.3  WebSocket生命周期     219

11.2.4  WebSocket连接关闭     220

11.3  Netty WebSocket协议开发     221

11.3.1  WebSocket服务端功能介绍     221

11.3.2  WebSocket服务端开发     222

11.3.3  运行WebSocket服务端     230

11.4  总结     231

第12章  UDP协议开发     233

12.1  UDP协议简介     234

12.2  UDP服务端开发     235

12.3  UDP客户端开发     238

12.4  运行UDP例程     240

12.5  总结     241

第13章  文件传输     242

13.1  文件的基础知识     243

13.1.1  文件的概念     243

13.1.2  文件路径     243

13.1.3  文件名称     244

13.1.4  FileChannel简介     244

13.2  Netty文件传输开发     245

13.3  运行Netty文件传输服务例程     248

13.4  总结     250

第14章  私有协议栈开发     251

14.1  私有协议介绍     251

14.2  Netty协议栈功能设计     253

14.2.1  网络拓扑图     253

14.2.2  协议栈功能描述     254

14.2.3  通信模型     254

14.2.4  消息定义     255

14.2.5  Netty协议支持的字段类型     256

14.2.6  Netty协议的编解码规范     257

14.2.7  链路的建立     259

14.2.8  链路的关闭     260

14.2.9  可靠性设计     260

14.2.10  安全性设计     262

14.2.11  可扩展性设计     262

14.3  Netty协议栈开发     263

14.3.1  数据结构定义     263

14.3.2  消息编解码     267

14.3.3  握手和安全认证     271

14.3.4  心跳检测机制     275

14.3.5  断连重连     278

14.3.6  客户端代码     279

14.3.7  服务端代码     281

14.4  运行协议栈     282

14.4.1  正常场景     282

14.4.2  异常场景:服务端宕机重启     283

14.4.3  异常场景:客户端宕机重启     286

14.5  总结     286

源码分析篇  Netty功能介绍和源码分析

第15章  ByteBuf和相关辅助类     290

15.1  ByteBuf功能说明     290

15.1.1  ByteBuf的工作原理     291

15.1.2  ByteBuf的功能介绍     296

15.2  ByteBuf源码分析     310

15.2.1  ByteBuf的主要类继承关系     311

15.2.2  AbstractByteBuf源码分析     312

15.2.3 AbstractReferenceCountedByteBuf源码分析     321

15.2.4  UnpooledHeapByteBuf源码分析     323

15.2.5  PooledByteBuf内存池原理分析     328

15.2.6  PooledDirectByteBuf源码分析     331

15.3  ByteBuf相关的辅助类功能介绍     334

15.3.1  ByteBufHolder  334

15.3.2  ByteBufAllocator  335

15.3.3  CompositeByteBuf 336

15.3.4  ByteBufUtil 338

15.4  总结     339

第16章  Channel和Unsafe  340

16.1  Channel 功能说明     340

16.1.1  Channel的工作原理     341

16.1.2  Channel的功能介绍     342

16.2  Channel源码分析     345

16.2.1  Channel的主要继承关系类图     345

16.2.2  AbstractChannel源码分析     346

16.2.3  AbstractNioChannel源码分析     349

16.2.4  AbstractNioByteChannel源码分析     352

16.2.5 AbstractNioMessageChannel源码分析     356

16.2.6 AbstractNioMessageServerChannel源码分析     357

16.2.7  NioServerSocketChannel源码分析     358

16.2.8  NioSocketChannel源码分析     360

16.3  Unsafe功能说明     366

16.4  Unsafe源码分析     367

16.4.1  Unsafe继承关系类图     367

16.4.2  AbstractUnsafe源码分析     367

16.4.3  AbstractNioUnsafe源码分析     377

16.4.4  NioByteUnsafe源码分析     380

16.5  总结     387

第17章  ChannelPipeline和ChannelHandler  389

17.1  ChannelPipeline功能说明     390

17.1.1  ChannelPipeline的事件处理     390

17.1.2  自定义拦截器     392

17.1.3  构建pipeline  393

17.1.4  ChannelPipeline的主要特性     394

17.2  ChannelPipeline源码分析     394

17.2.1  ChannelPipeline的类继承关系图     394

17.2.2  ChannelPipeline对ChannelHandler的管理     394

17.2.3  ChannelPipeline的inbound事件     397

17.2.4  ChannelPipeline的outbound事件     398

17.3  ChannelHandler功能说明     399

17.3.1  ChannelHandlerAdapter功能说明     400

17.3.2  ByteToMessageDecoder功能说明     400

17.3.3 MessageToMessageDecoder功能说明     401

17.3.4 LengthFieldBasedFrameDecoder功能说明     402

17.3.5  MessageToByteEncoder功能说明     405

17.3.6 MessageToMessageEncoder功能说明     406

17.3.7  LengthFieldPrepender功能说明     406

17.4  ChannelHandler源码分析     407

17.4.1  ChannelHandler的类继承关系图     407

17.4.2  ByteToMessageDecoder源码分析     408

17.4.3 MessageToMessageDecoder源码分析     411

17.4.4 LengthFieldBasedFrameDecoder源码分析     413

17.4.5  MessageToByteEncoder源码分析     417

17.4.6 MessageToMessageEncoder源码分析     418

17.4.7  LengthFieldPrepender源码分析     419

17.5  总结     420

第18章  EventLoop和EventLoopGroup  421

18.1  Netty的线程模型     421

18.1.1  Reactor单线程模型     422

18.1.2  Reactor多线程模型     423

18.1.3  主从Reactor多线程模型     424

18.1.4  Netty的线程模型     425

18.1.5  最佳实践     427

18.2  NioEventLoop源码分析     427

18.2.1  NioEventLoop设计原理     427

18.2.2  NioEventLoop继承关系类图     428

18.2.3  NioEventLoop  429

18.3  总结     440

第19章  Future和Promise  441

19.1  Future功能     441

19.2  ChannelFuture源码分析     446

19.3  Promise功能介绍     448

19.4  Promise源码分析     450

19.4.1  Promise继承关系图     450

19.4.2  DefaultPromise  450

19.5  总结     453

架构和行业应用篇  Netty高级特性

第20章  Java多线程编程在Netty中的应用     456

20.1  Java内存模型与多线程编程     456

20.1.1  硬件的发展和多任务处理     456

20.1.2  Java内存模型     457

20.2  Netty的并发编程实践     459

20.2.1  对共享的可变数据进行正确的同步     459

20.2.2  正确的使用锁     460

20.2.3  volatile的正确使用     462

20.2.4  CAS指令和原子类     465

20.2.5  线程安全类的应用     467

20.2.6  读写锁的应用     470

20.2.7  线程安全性文档说明     472

20.2.8  不要依赖线程优先级     473

20.3  总结     474

第21章  Netty架构剖析     475

21.1  Netty逻辑架构     475

21.1.1  Reactor通信调度层     476

21.1.2  职责链ChannelPipeline  476

21.1.3  业务逻辑编排层(Service ChannelHandler)     477

21.2  关键架构质量属性     477

21.2.1  高性能     477

21.2.2  可靠性     480

21.2.3  可定制性     483

21.2.4  可扩展性     483

21.3  总结     483

第22章  Netty行业应用     484

22.1  Netty在互联网行业的应用     485

22.1.1  传统垂直架构面临的问题     485

22.1.2  阿里分布式服务框架Dubbo  485

22.1.3  Dubbo的架构介绍     487

22.1.4  Netty在Dubbo中的应用     489

22.1.5  Dubbo框架集成Netty源码分析     491

22.2  Netty在大数据领域的应用     496

22.3  Netty在游戏行业的应用     497

22.3.1  游戏服务端架构介绍     498

22.3.2  Netty在游戏服务端的应用     501

22.4  总结     502

第23章  Netty未来展望     503

23.1  应用范围     503

23.2  技术演进     504

23.3  社区活跃度     504

23.4  Road Map  504

23.5  总结     505

附录A  Netty参数配置表     506

作者简介

李林锋:Netty中国推广者,现华为技术有限公司平台中间件架构与设计部设计师,公司总裁技术创新奖获得者。长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。

媒体评论

与林锋兄相识甚早,他在NIO相关领域实战经验丰富,成绩斐然,并且乐于分享,旨在帮助更多人得到技术上的进步,是一位我很尊敬的技术思考者、实践者和推广者。Netty作为Dubbo底层的高性能分布式通信框架,在实际开发中,我非常关心如高效序列化/编解码、线程模型调优、高效Buffer使用、心跳重连策略、优雅停机、宕机异常处理、NIO并发安全处理等核心问题,而本书中对这些问题都进行了详细说明,并提炼出了处理原则,给出了提纲挈领般的引导。书中对这些问题的分析总结可以得到不少从头摸爬滚打才能获得的收获,希望你和我一样能有眼前一亮的感觉。

——阿里巴巴Dubbo、PaaS平台核心开发架构师李鼎

Netty是一个令人惊讶的项目,在短短几年成为众多Java高并发异步通信的首选框架。但目前国内资料极少并缺乏系统性,而李兄的这本系统介绍Netty开发和原理的书籍,很完美地填补了这个空白。国内的技术人员对Java NIO和Netty理解多一些,也就意味着国内整体网络编程技术的进步。本书条理清晰,对技术的阐述循序渐进,是一本难得的Netty学习教材,推荐有志青年仔细学习研究本书,共同把NIO异步通信编程推向一个新高度。

——JBoss应用服务器核心开发组成员张建锋

经常有很多Java领域的应届生和程序员来咨询我我,说自己非常希望找到心仪的工作,但是不知道如何学习和提高。在Java中我觉得比较有挑战性的技术就是网络I/O编程和多线程并发编程,而Netty作为企业高性能异步NIO通信的首选框架,在Twitter、Facebook、阿里巴巴等著名公司都得到了应用,学习和掌握它,对于个人的职业和技术发展都极具意义。本书正是一本引领我们由浅入深学习Netty的宝典,非常值得仔细研读和思考。

——并发编程网站长方腾飞

网络通信框架Netty已经逐渐成为了构建高可用分布式系统核心组件通信的基础,它的线程模型、零拷贝和多协议支持也让从业者们爱不释手,林锋兄作为国内NIO领域和Netty框架研究最早、水平最高的架构师之一,在本书中对Netty进行了全面的解析,其中大量的源码剖析和实战讲解给想学习NIO编程和Netty,进阶分布式的同学提出了一些思想或者说指引了前进方向,非常推荐。

——1号店资深架构师彭荣新

前言

大约在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 NIO框架的绝大部分知识点,包括JavaI/O的演进历史、传统BIO通信的弊端、Java 4种I/O通信模型的优缺点对比。以及Netty入门、Netty编解码框架、文件传输、多协议和私有协议栈定制和开发。在源码分析章节,详细介绍了ByteBuf、Channel和Unsafe、ChannelPipeline和ChannelHandler、NioEventLoop、ChannelFuture和ChannelPromise的设计原理和源码分析。在高级应用章节,介绍了Netty的逻辑架构模型、Netty的线程模型和行业应用。最后附录了Netty启动配置参数项说明。

联系方式

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

致谢

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

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

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

李林锋  5月11日于南京紫轩阁


 

你可能感兴趣的:(信息安全技术,软件工程,程序设计)