目 录 
 
 
 
第一部分 源码解析与实战入门 
第1章 Netty初印象 2 
1.1 Netty的定义 2 
1.2 Netty并非万能 3 
1.3 Netty程序是什么样的 4 
1.3.1 HTTP服务器构建案例 4 
1.3.2 自定义TCP服务器案例 6 
1.4 为什么不直接基于JDK NIO编程 8 
1.4.1 Netty做得更多 8 
1.4.2 Netty做得更好 9 
1.4.3 基于JDK NIO实现难度太大 11 
1.5 Netty相比同类框架的优势 13 
1.5.1 Apache的Mina 13 
1.5.2 Sun的Grizzly 13 
1.5.3 Apple的Swift NIO和ACE等 14 
1.5.4 Cindy和其他框架 14 
1.6 Netty的过去、现状与发展趋势 14 
1.6.1 Netty的过去 15 
1.6.2 Netty的现状 16 
1.6.3 Netty的发展趋势 18 
第2章 准备工作 19 
2.1 环境准备 19 
2.1.1 准备源码阅读环境 19 
2.1.2 准备实战案例环境 20 
2.2 Netty代码编译及常见问题 20 
2.2.1 常见编译问题一 20 
2.2.2 常见编译问题二 22 
2.3 Netty代码结构速览 24 
2.4 本书借鉴的常用开源软件 26 
2.4.1 Cassandra 26 
2.4.2 Dubbo 26 
2.4.3 Hadoop 27 
2.4.4 Lettuce 27 
2.4.5 GRPC 28 
2.4.6 WebFlux 28 
2.5 编写网络应用程序的基本步骤 29 
2.5.1 完成代码编写 29 
2.5.2 复查代码 30 
2.5.3 “临门一脚” 31 
2.5.4 上线及反馈 31 
2.6 实战案例介绍 32 
第3章 数据编码 34 
3.1 网络编程中为什么要进行数据 
编码 34 
3.2 常见的数据编码方式及选择要点 35 
3.2.1 常见的数据编码方式 36 
3.2.2 数据编码选择要点 39 
3.3 基于源码解析Netty对常见数据 
编解码的支持 42 
3.3.1 解析编解码支持的原理 42 
3.3.2 解析典型Netty数据编解码的 
实现 44 
3.4 常见开源软件对编解码的使用 47 
3.4.1 Cassandra 47 
3.4.2 Dubbo 48 
3.5 为实战案例选择数据编解码方案 51 
3.5.1 定义JSON编解码方法 51 
3.5.2 提供消息的完整编解码实现 52 
3.5.3 实现Netty的编解码处理程序 53 
3.6 常见疑问和实战易错点解析 54 
3.6.1 常见疑问解析 54 
3.6.2 常见实战易错点解析 56 
第4章 封帧 58 
4.1 网络编程为什么需要进行消息的 
定界 58 
4.1.1 TCP 58 
4.1.2 UDP 60 
4.2 常见的消息定界方式 61 
4.2.1 TCP短连接方式 61 
4.2.2 固定长度方式 61 
4.2.3 封帧 62 
4.2.4 其他方式 63 
4.3 通过源码解析Netty如何支持 
封帧 63 
4.3.1 追加数据 65 
4.3.2 尝试解析出消息对象 65 
4.3.3 传递解析出的消息对象 66 
4.4 常见开源软件如何封帧 67 
4.4.1 Dubbo的帧结构 67 
4.4.2 Cassandra的帧结构 67 
4.4.3 Hadoop的帧结构 67 
4.5 为实战案例定义封帧方式 69 
4.6 常见疑问和实战易错点解析 70 
4.6.1 常见疑问解析 70 
4.6.2 常见实战易错点解析 72 
第5章 网络编程模式 74 
5.1 网络编程的3种模式 74 
5.2 网络编程模式的选择要点 75 
5.3 基于源码解析Netty对网络编程 
模式的支持 76 
5.3.1 Netty对网络编程模式的支持 
情况 76 
5.3.2 Netty对网络编程模式的实现 
要点 78 
5.4 常见开源软件是如何支持网络 
编程模式的 81 
5.4.1 Lettuce 81 
5.4.2 Cassandra 83 
5.5 为实战案例选择网络编程模式 84 
5.6 常见疑问和实战易错点解析 84 
5.6.1 常见疑问解析 84 
5.6.2 常见实战易错点解析 86 
第6章 线程模型 89 
6.1 NIO的3种Reactor模式 89 
6.1.1 Reactor单线程模式 91 
6.1.2 Reactor多线程模式 92 
6.1.3 Reactor主从多线程模式 92 
6.2 源码解析Netty对3种Reactor 
模式的支持 93 
6.2.1 如何在Netty中使用这3种 
Reactor模式 93 
6.2.2 Netty在内部是如何支持Reactor 
模式的 94 
6.3 Netty线程模型的可优化点 98 
6.4 常见开源软件是如何使用Reactor 
模式的 101 
6.4.1 Cassandra 101 
6.4.2 Dubbo 102 
6.4.3 Hadoop 105 
6.5 为实战案例选择和实现线程模型 106 
6.5.1 使用Reactor主从多线程模式 106 
6.5.2 使用独立线程池 106 
6.6 常见疑问和实战易错点解析 110 
6.6.1 常见疑问解析 110 
6.6.2 常见实战易错点解析 114 
第二部分 源码解析与实战进阶 
第7章 基于实战案例剖析Netty的 
核心流程 118 
7.1 剖析启动服务源码及技巧 119 
7.1.1 主线 119 
7.1.2 知识点 122 
7.2 剖析构建连接源码及技巧 124 
7.2.1 主线 124 
7.2.2 知识点 127 
7.3 剖析读取数据源码及技巧 127 
7.3.1 主线 128 
7.3.2 知识点 130 
7.4 剖析处理业务源码及技巧 131 
7.4.1 主线 131 
7.4.2 知识点 134 
7.5 剖析发送数据源码及技巧 135 
7.5.1 主线 135 
7.5.2 知识点 141 
7.6 剖析关闭连接源码及技巧 141 
7.6.1 主线 141 
7.6.2 知识点 143 
7.7 剖析关闭服务源码及技巧 143 
7.7.1 主线 144 
7.7.2 知识点 148 
第8章 参数调整 149 
8.1 参数调整概览 149 
8.1.1 操作系统参数调整 149 
8.1.2 Netty系统参数调整 150 
8.1.3 Netty非系统参数调整 153 
8.2 常见开源软件对Netty参数进行的 
设置 155 
8.3 调整案例程序的各个参数 156 
8.4 常见疑问分析 156 
8.4.1 使用option()和childOption() 
方法设置参数的区别 157 
8.4.2 参数ALLOW_HALF_CLOSURE 
的用途与使用场景 159 
第9章 诊断性优化 161 
9.1 Netty日志优化 161 
9.1.1 源码解析 161 
9.1.2 开源案例 164 
9.1.3 实战案例 166 
9.2 Netty的关键诊断信息及可视化 
方案 169 
9.2.1 Netty的关键诊断信息 170 
9.2.2 诊断信息的可视化方案 171 
9.2.3 实战案例 173 
9.3 Netty内存泄漏检测 176 
9.3.1 检测原理 176 
9.3.2 检测的几个关键点 180 
9.3.3 实战案例 182 
9.4 常见疑问和实战易错点解析 183 
9.4.1 常见疑问解析 184 
9.4.2 常见实战易错点解析 188 
第10章 性能优化 189 
10.1 优化写数据的性能 189 
10.1.1 源码解析 190 
10.1.2 开源案例 193 
10.1.3 实战案例 197 
10.2 使用Native NIO 198 
10.2.1 源码解析 198 
10.2.2 实战案例 202 
10.3 常见疑问分析 203 
10.3.1 Native库的加载顺序 203 
10.3.2 check volume for noexec flag的 
含义 205 
第11章 系统增强 207 
11.1 Netty高低水位线保护 207 
11.1.1 源码解析 207 
11.1.2 开源案例 209 
11.1.3 实战案例 210 
11.2 Netty流量控制保护 211 
11.2.1 源码解析 212 
11.2.2 实战案例 216 
11.3 Netty空闲监测防护 218 
11.3.1 源码解析 220 
11.3.2 开源案例 224 
11.3.3 实战案例 225 
11.4 常见疑问解析 228 
11.4.1 HTTP Keep-Alive和keepalive 
之间的区别 228 
11.4.2 IdleStateHandler中observeOutput 
的功能 228 
11.4.3 FileRegion的发送受高低水位线 
控制吗 230 
第12章 安全性提升 233 
12.1 黑白名单 233 
12.1.1 源码分析 234 
12.1.2 实战案例 239 
12.1.3 业界案例 241 
12.2 自定义授权 243 
12.2.1 实战案例 244 
12.2.2 业界案例 247 
12.3 SSL加密 249 
12.3.1 理解SSL的本质 249 
12.3.2 源码解析 251 
12.3.3 实战案例 254 
12.3.4 业界案例 256 
12.4 常见疑问解析 258 
12.4.1 如何设置IpSubnetFilterRule的 
ipAddress 258 
12.4.2 如何精确拦截连接地址 259 
12.4.3 我们可以在创建连接时进行 
连接控制吗 259 
12.4.4 OptionalSslHandler的用途和 
实现方法 260 
第13章 可用性提升 262 
13.1 使用响应分发进行优化 262 
13.1.1 改进需求分析 262 
13.1.2 改进策略的分析并应用 263 
13.2 使用代理技术进行优化 266 
13.2.1 改进需求分析 267 
13.2.2 改进策略的分析及应用 269 
13.3 使用响应式编程进行优化 271 
13.3.1 改进需求分析 271 
13.3.2 改进策略的分析及应用 272 
 
第三部分 拓展 
第14章 基于Netty构建UDP应用 276 
14.1 解析Netty对UDP编程提供的 
支持 276 
14.2 服务器实现 279 
14.2.1 实现请求解码器 279 
14.2.2 实现业务处理程序 280 
14.2.3 实现响应编码器 281 
14.2.4 构建UDP服务器 281 
14.3 客户端实现 282 
14.3.1 基于Netty的NIO客户端 282 
14.3.2 基于Netty的OIO客户端 285 
14.3.3 基于JDK的客户端 285 
14.4 扩展知识 286 
14.4.1 目标地址的两种常见设置 
方式 286 
14.4.2 UDP包的发送方式 288 
14.4.3 UDP广播及支持 290 
14.5 常见易错点 290 
14.5.1 误用JDK的DatagramPacket 290 
14.5.2 误用ctx.channel().remoteAddress() 
作为目标地址 292 
14.5.3 发送的数据内容过多 294 
14.5.4 误解客户端执行绑定操作的 
意义 296 
第15章 基于Netty构建HTTP应用 298 
15.1 解析Netty是如何支持HTTP 
服务的 298 
15.1.1 编解码器HttpServerCodec 299 
15.1.2 ExpectContinue处理程序HttpServer- 
ExpectContinueHandler 302 
15.1.3 请求合并器 
HttpObjectAggregator 305 
15.1.4 其他常用的HTTP处理程序 313 
15.2 开源软件如何使用Netty构建 
HTTP服务 314 
 
15.2.1 Hadoop如何使用Netty构建 
Web Hdfs 314 
15.2.2 WebFlux如何基于Netty构建 
Web服务 319 
15.3 将案例程序改造为HTTP 
应用 324 
15.3.1 完成业务处理程序 325 
15.3.2 组合处理程序以搭建HTTP 
服务器 326 
15.4 常见疑问解析 327 
15.4.1 HttpServerExpectContinueHandler 
和HttpObjectAggregator能否 
共存 327 
15.4.2 何时需要写LastHttpContent 328 
15.4.3 HttpChunkedInput必须与 
transfer-encoding:chunked 
绑定在一起吗 331 
15.4.4 其他流行框架如何根据请求 
定位到处理位置 332 
第16章 Netty对文件应用的支持 334 
16.1 FileRegion 334 
16.1.1 Netty如何支持FileRegion 335 
16.1.2 解析FileRegion的劣势 337 
16.2 ChunkedFile/ChunkedNioFile 338 
16.2.1 比较ChunkedFile与 
ChunkedNioFile 338 
16.2.2 解析ChunkedWriteHandler的 
实现 339 
16.3 Netty文件应用案例解析 342 
第17章 Netty的另类特性 344 
17.1 Netty对虚拟机内管道提供的 
支持 344 
17.1.1 解析JDK自带的管道技术 344 
17.1.2 如何使用Netty的虚拟机内 
管道 347 
17.1.3 基于源码解析Netty的虚拟机内 
管道 349 
17.2 Netty对UNIX域套接字提供的 
支持 353 
17.2.1 如何使用Netty的域套接字 353 
17.2.2 基于源码解析Netty的域 
套接字 355 
17.3 Netty对JDK的ThreadLocal所做的 
优化 359 
17.3.1 在Netty中如何使用 
FastThreadLocal 359 
17.3.2 基于源码解析ThreadLocal的 
性能缺陷 360 
17.3.3 基于源码解析FastThreadLocal 
所做的优化 362 
17.4 Netty对JDK的Timer所做的 
优化 365 
17.4.1 在Netty中如何使用 
HashedWheelTimer 365 
17.4.2 基于源码解析Timer的性能 
缺陷 366 
17.4.3 基于源码解析HashedWheelTimer 
所做的优化 368 
第18章 Netty编程思想 372 
18.1 注解的使用 372 
18.1.1 @UnstableApi 373 
18.1.2 @Skip 373 
18.1.3 @Sharable 374 
18.1.4 @SuppressJava6Requirement 375 
18.1.5 @SuppressForbidden 377 
18.2 内存的使用 380 
18.2.1 减小对象本身 380 
18.2.2 对分配的内存进行预估 381 
18.2.3 采用零复制 382 
18.2.4 使用堆外内存 384 
18.2.5 使用内存池 385 
18.3 多线程并发 386 
18.3.1 注意锁的对象和范围 386 
18.3.2 注意锁的对象本身的大小 386 
18.3.3 注意锁的速度 387 
18.3.4 为不同场景选择不同的 
并发类 387 
18.3.5 衡量好锁的价值 388 
18.4 开发流程 389 
18.4.1 建立需求 389 
18.4.2 编写代码 390 
18.4.3 平台校验 391 
18.4.4 人工审阅 393 
18.4.5 出包管理 393 
18.5 代码规范 394 
18.5.1 遵循代码风格 394 
18.5.2 易于使用 395 
18.5.3 小步前进、逐步修改 395 
18.5.4 符合提交规范 396 
附录A Netty TCP通信支持的实现 399 
附录B 一些重要术语的翻译 400
					展开