《Netty权威指南》是全球第二本、中国第一本Netty教材,它由华为平台中间件资深架构设计师李林锋撰写,作者有6年多的NIO设计和开发实战经验,多次受邀进行Netty和
NIO编程培训。
本书基于最新的Netty5.0 版本撰写,从Netty开发环境的搭建,到第一个基于Netty的NIO服务端和客户端程序的开发,一步步的让读者从入门到精通,熟练的掌握基于Netty
的NIO开发,理解Netty的架构设计原理,可以对Netty进行深度的定制设计和开发。
本书共分为五部分:
第一部分介绍 JAVA NIO的入门知识,包括 Java NIO的演进和NIO编程入门。
第二部分是Netty入门,包括Netty开发环境的搭建、第一个服务端和客户端的开发与调试。
第三部分对Netty的编解码模块进行了详细介绍,包括编解码的基础知识、Java序列化、Google ProtoBuf和Jboss Marshalling序列化框架的应用;
第四部分是Netty多协议开发,详细介绍了基于Netty的HTTP协议、WebSocket协议、UDP协议和文件传输的设计和开发,最后讲解了如何利用Netty进行私有协议栈的设计和开发。
第五部分对Netty的主要类库源码进行了分析,包括ByteBuf和Unsafe、ChannelPipeline和ChannelHandler、EventLoop和EventLoopGroup、Future和Promise。
第六部分介绍了Netty的高级应用,包括Java多线程编程在Netty中的应用、Netty的架构剖析、Netty在互联网行业的应用、Netty在大数据领域的应用,最后是Netty的未来展望。
附录包含了Netty的启动参数配置列表。
下面是本书的目录:
Netty权威指南…………………………………………………………………………………………………. 1
第 1章 Java的IO演进之路……………………………………………………………………………… 10
1.1. IO基础入门……………………………………………………………………………………… 11
1.1.1. Linux网络IO模型简介…………………………………………………………….. 11
1.1.2. IO多路复用技术……………………………………………………………………… 14
1.2. Java的IO演进…………………………………………………………………………………. 15
1.2.1. Java的IO发展简史…………………………………………………………………. 15
1.3. 总结………………………………………………………………………………………………… 16
第 2 章NIO入门…………………………………………………………………………………………… 17
2.1. 传统的BIO编程……………………………………………………………………………….. 18
2.1.1. BIO通信模型图……………………………………………………………………….. 18
2.1.2. 同步阻塞式IO创建的TimeServer源码分析………………………………… 18
2.1.3. 同步阻塞式IO创建的TimeClient源码分析………………………………… 22
2.2. 伪异步IO编程…………………………………………………………………………………. 24
2.2.1. 伪异步IO模型图…………………………………………………………………….. 25
2.2.2. 伪异步式IO创建的TimeServer源码分析……………………………………. 25
2.2.3. 伪异步IO弊端分析………………………………………………………………….. 28
2.3. NIO编程…………………………………………………………………………………………. 30
2.3.1. NIO类库简介…………………………………………………………………………… 31
2.3.2. NIO服务端序列图……………………………………………………………………. 34
2.3.3. NIO创建的TimeServer源码分析……………………………………………….. 36
2.3.4. NIO客户端序列图……………………………………………………………………. 42
2.3.5. NIO创建的TimeClient源码分析……………………………………………….. 45
2.4. AIO编程…………………………………………………………………………………………. 51
2.4.1. AIO 创建的TimeServer源码分析………………………………………………. 51
2.4.2. AIO创建的TimeClient源码分析……………………………………………….. 57
2.4.3. AIO版本时间服务器运行结果……………………………………………………. 62
2.5. 4种IO的对比………………………………………………………………………………….. 64
2.5.1. 概念澄清………………………………………………………………………………… 64
2.5.2. 不同IO模型对比…………………………………………………………………….. 65
2.6. 选择Netty的理由……………………………………………………………………………… 66
2.6.1. 不选择JAVA原生NIO编程的原因………………………………………………. 66
2.6.2. 为什么选择Netty……………………………………………………………………. 68
2.7. 总结………………………………………………………………………………………………… 68
第 3 章Netty入门应用…………………………………………………………………………………… 70
3.1. Netty开发环境的搭建……………………………………………………………………….. 71
3.1.1. 下载Netty的软件包………………………………………………………………… 71
3.1.2. 搭建Netty应用工程………………………………………………………………… 72
3.2. Netty服务端开发………………………………………………………………………………. 73
3.2.1. TimeServer开发……………………………………………………………………… 73
3.3. Netty客户端开发………………………………………………………………………………. 77
3.3.1. TimeClient开发……………………………………………………………………… 77
3.4. 运行和调试………………………………………………………………………………………. 81
3.4.1. 服务端和客户端的运行…………………………………………………………….. 81
3.4.2. 打包和部署…………………………………………………………………………….. 82
3.5. 总结………………………………………………………………………………………………… 82
第 4 章TCP粘包/拆包问题的解决之道…………………………………………………………….. 83
4.1. TCP粘包/拆包………………………………………………………………………………….. 84
4.1.1. TCP粘包/拆包问题说明……………………………………………………………. 84
4.1.2. TCP粘包/拆包发生的原因…………………………………………………………. 85
4.1.3. 粘包问题的解决策略………………………………………………………………… 85
4.2. 未考虑TCP粘包导致功能异常的案例………………………………………………….. 86
4.2.1. TimeServer的改造…………………………………………………………………… 86
4.2.2. TimeClient的改造…………………………………………………………………… 87
4.2.3. 运行结果………………………………………………………………………………… 89
4.3. 利用LineBasedFrameDecoder解决TCP粘包问题…………………………………… 91
4.3.1. 支持TCP粘包的TimeServer……………………………………………………… 92
4.3.2. 支持TCP粘包的TimeClient……………………………………………………… 95
4.3.3. 运行支持TCP粘包的时间服务器程序………………………………………….. 98
4.3.4. LineBasedFrameDecoder和StringDecoder的原理分析……………….. 103
4.4. 总结………………………………………………………………………………………………. 103
第 5 章分隔符和定长解码器的应用……………………………………………………………….. 104
5.1. DelimiterBasedFrameDecoder应用开发……………………………………………….. 105
5.1.1. DelimiterBasedFrameDecoder服务端开发…………………………………. 105
5.1.2. DelimiterBasedFrameDecoder客户端开发…………………………………. 108
5.1.3. 运行DelimiterBasedFrameDecoder服务端和客户端程序……………… 111
5.2. FixedLengthFrameDecoder应用开发…………………………………………………… 112
5.2.1. FixedLengthFrameDecoder服务端开发……………………………………… 112
5.2.2. 利用telnet命令行测试EchoServer服务端……………………………….. 115
5.3. 总结………………………………………………………………………………………………. 116
第 6 章编解码介绍………………………………………………………………………………………. 118
6.1. Java序列化的缺点…………………………………………………………………………… 119
6.1.1. 无法跨语言……………………………………………………………………………. 119
6.1.2. 序列化后的码流太大………………………………………………………………. 119
6.1.3. 序列化性能太低…………………………………………………………………….. 122
6.2. 业界主流的编解码框架简介………………………………………………………………. 125
6.2.1. Google的Protobuf介绍…………………………………………………………. 125
6.2.2. FaceBook的Thrift介绍…………………………………………………………. 127
6.2.3. Jboss Marshalling介绍…………………………………………………………. 128
6.3. 总结………………………………………………………………………………………………. 128
第 7 章Java序列化………………………………………………………………………………………. 129
7.1. Netty Java序列化服务端开发…………………………………………………………….. 130
7.1.1. 服务端开发例程…………………………………………………………………….. 130
7.2. Java序列化Netty客户端开发……………………………………………………………. 138
7.2.1. 客户端开发例程…………………………………………………………………….. 139
7.3. 运行结果………………………………………………………………………………………… 142
7.3.1. 运行Java序列化例程…………………………………………………………….. 142
7.4. 总结………………………………………………………………………………………………. 144
第 8 章Google Protobuf编解码……………………………………………………………………… 145
8.1. Protobuf的入门………………………………………………………………………………. 146
8.1.1. Protobuf开发环境搭建…………………………………………………………… 146
8.1.2. Protobuf编解码开发……………………………………………………………… 149
8.1.3. 运行Protobuf例程………………………………………………………………… 150
8.2. Netty的Protobuf服务端开发…………………………………………………………….. 151
8.2.1. Protobuf版本的图书订购服务端开发……………………………………….. 151
8.2.2. Protobuf版本的图书订购客户端开发……………………………………….. 154
8.2.3. Protobuf版本的图书订购程序功能测试……………………………………. 158
8.3. Protobuf的使用注意事项………………………………………………………………….. 161
8.4. 总结………………………………………………………………………………………………. 162
第 9 章Jboss Marshalling 编解码…………………………………………………………………… 163
9.1. Marshalling开发环境准备…………………………………………………………………. 163
9.2. Netty的Marshalling服务端开发………………………………………………………… 164
9.2.1. 服务端开发示例…………………………………………………………………….. 164
9.3. Netty的Marshalling客户端开发………………………………………………………… 167
9.3.1. 客户端开发示例…………………………………………………………………….. 167
9.4. 运行Marshalling客户端和服务端例程………………………………………………… 169
9.5. 总结………………………………………………………………………………………………. 171
第 10 章HTTP协议开发应用………………………………………………………………………… 173
10.1. HTTP协议介绍……………………………………………………………………………… 174
10.1.1. HTTP协议的URL……………………………………………………………………. 174
10.1.2. HTTP请求消息(HttpRequest)……………………………………………… 174
10.1.3. HTTP请求响应消息(HttpResponse)……………………………………… 177
10.2. Netty HTTP服务端入门开发……………………………………………………………. 178
10.2.1. HTTP服务端例程场景描述……………………………………………………… 179
10.2.2. HTTP服务端开发…………………………………………………………………… 179
10.2.3. Netty HTTP文件服务器例程运行结果……………………………………… 189
10.3. Netty HTTP+XML协议栈开发…………………………………………………………. 194
10.3.1. 开发场景介绍………………………………………………………………………. 195
10.3.2. HTTP+XML协议栈设计……………………………………………………………. 198
10.3.3. 高效的XML绑定框架JiBx……………………………………………………… 199
10.3.4. HTTP+XML编解码框架开发……………………………………………………… 209
10.3.5. HTTP+XML协议栈测试……………………………………………………………. 229
10.3.6. 小结…………………………………………………………………………………… 231
10.4. 总结…………………………………………………………………………………………….. 231
第 11 章WebSocket 协议开发应用…………………………………………………………………. 232
11.1. HTTP协议的弊端………………………………………………………………………….. 233
11.2. WebSocket入门……………………………………………………………………………… 233
11.2.1. WebSocket背景……………………………………………………………………. 234
11.2.2. WebSocket连接建立……………………………………………………………… 234
11.2.3. WebSocket生命周期……………………………………………………………… 236
11.2.4. WebSocket连接关闭……………………………………………………………… 236
11.3. Netty WebSocket应用开发………………………………………………………………. 237
11.3.1. WebSocket服务端功能介绍……………………………………………………. 237
11.3.2. WebSocket服务端开发…………………………………………………………… 239
11.3.3. 运行WebSocket服务端………………………………………………………….. 246
11.4. 总结…………………………………………………………………………………………….. 247
第 12 章UDP协议开发应用………………………………………………………………………….. 249
12.1. UDP协议简介……………………………………………………………………………….. 250
12.2. UDP服务端开发……………………………………………………………………………. 251
12.3. UDP客户端开发……………………………………………………………………………. 253
12.4. 运行UDP流程………………………………………………………………………………. 255
12.5. 总结…………………………………………………………………………………………….. 256
第 13 章文件传输……………………………………………………………………………………….. 257
13.1. 文件的基础知识…………………………………………………………………………….. 258
13.1.1. 文件的概念………………………………………………………………………….. 258
13.1.2. 文件路径…………………………………………………………………………….. 258
13.1.3. 文件名称…………………………………………………………………………….. 258
13.1.4. FileChannel简介…………………………………………………………………. 259
13.2. Netty文件传输开发……………………………………………………………………….. 260
13.3. 运行Netty文件传输服务例程………………………………………………………….. 263
13.4. 总结…………………………………………………………………………………………….. 264
第 14 章私有协议栈开发………………………………………………………………………………. 266
14.1. 私有协议介绍………………………………………………………………………………… 267
14.2. Netty协议栈功能设计…………………………………………………………………….. 267
14.2.1. 网络拓扑图………………………………………………………………………….. 268
14.2.2. 协议栈功能描述…………………………………………………………………… 268
14.2.3. 通信模型…………………………………………………………………………….. 269
14.2.4. 消息定义…………………………………………………………………………….. 270
14.2.5. Netty协议支持的字段类型……………………………………………………. 271
14.2.6. Netty协议的编解码规范……………………………………………………….. 271
14.2.7. 链路的建立………………………………………………………………………….. 273
14.2.8. 链路的关闭………………………………………………………………………….. 274
14.2.9. 可靠性设计………………………………………………………………………….. 274
14.2.10. 安全性设计………………………………………………………………………… 276
14.2.11. 可扩展性设计…………………………………………………………………….. 276
14.3. Netty协议栈开发…………………………………………………………………………… 277
14.3.1. 数据结构定义………………………………………………………………………. 277
14.3.2. 消息编解码………………………………………………………………………….. 280
14.3.3. 握手和安全认证…………………………………………………………………… 285
14.3.4. 心跳检测机制………………………………………………………………………. 289
14.3.5. 断连重连…………………………………………………………………………….. 292
14.3.6. 客户端代码………………………………………………………………………….. 292
14.3.7. 服务端代码………………………………………………………………………….. 294
14.4. 运行协议栈…………………………………………………………………………………… 295
14.4.1. 正常场景…………………………………………………………………………….. 295
14.4.2. 异常场景:服务端宕机重启…………………………………………………… 296
14.4.3. 异常场景:客户端宕机重启…………………………………………………… 299
14.5. 总结…………………………………………………………………………………………….. 300
第 15 章ByteBuf 和相关辅助类…………………………………………………………………… 302
15.1. ByteBuf 功能说明…………………………………………………………………………. 303
15.1.1. ByteBuf的工作原理……………………………………………………………… 304
15.1.2. ByteBuf的功能介绍……………………………………………………………… 308
15.2. ByteBuf源码分析………………………………………………………………………….. 323
15.2.1. ByteBuf的主要类继承关系……………………………………………………. 323
15.2.2. AbstractByteBuf源码分析……………………………………………………. 324
15.2.3. AbstractReferenceCountedByteBuf源码分析…………………………… 333
15.2.4. UnpooledHeapByteBuf源码分析……………………………………………… 335
15.2.5. PooledByteBuf内存池原理分析……………………………………………… 340
15.2.6. PooledDirectByteBuf源码分析……………………………………………… 343
15.3. ByteBuf相关的辅助类功能介绍……………………………………………………….. 345
15.3.1. ByteBufHolder…………………………………………………………………….. 345
15.3.2. ByteBufAllocator………………………………………………………………… 346
15.3.3. CompositeByteBuf………………………………………………………………… 347
15.3.4. ByteBufUtil………………………………………………………………………… 349
15.4. 总结…………………………………………………………………………………………….. 350
第 16 章Channel 和 Unsafe………………………………………………………………………….. 351
16.1. Channel 功能说明…………………………………………………………………………. 352
16.1.1. Channel的工作原理……………………………………………………………… 352
16.1.2. Channel的功能介绍……………………………………………………………… 352
16.2. Channel源码分析………………………………………………………………………….. 355
16.2.1. Channel的主要继承关系图……………………………………………………. 356
16.2.2. AbstractChannel源码分析……………………………………………………. 357
16.2.3. AbstractNioChannel源码分析……………………………………………….. 359
16.2.4. AbstractNioByteChannel源码分析…………………………………………. 362
16.2.5. AbstractNioMessageChannel源码分析……………………………………. 365
16.2.6. AbstractNioMessageServerChannel源码分析…………………………… 367
16.2.7. NioServerSocketChannel源码分析…………………………………………. 367
16.2.8. NioSocketChannel源码分析…………………………………………………… 370
16.3. Unsafe功能说明…………………………………………………………………………….. 375
16.4. Unsafe源码分析…………………………………………………………………………….. 376
16.4.1. Unsafe继承关系类图……………………………………………………………. 376
16.4.2. AbstractUnsafe源码分析……………………………………………………… 377
16.4.3. AbstractNioUnsafe源码分析…………………………………………………. 386
16.4.4. NioByteUnsafe源码分析……………………………………………………….. 389
16.5. 总结…………………………………………………………………………………………….. 396
第 17 章ChannelPipeline和ChannelHandler…………………………………………………….. 397
17.1. ChannelPipeline功能说明……………………………………………………………….. 398
17.1.1. ChannelPipeline的事件处理…………………………………………………. 398
17.1.2. 自定义拦截器………………………………………………………………………. 400
17.1.3. 构建pipeline……………………………………………………………………… 401
17.1.4. ChannelPipeline的主要特性…………………………………………………. 401
17.2. ChannelPipeline源码分析……………………………………………………………….. 402
17.2.1. ChannelPipeline的类继承关系图…………………………………………… 402
17.2.2. ChannelPipeline对ChannelHandler的管理…………………………….. 402
17.2.3. ChannelPipeline的inbound事件…………………………………………… 405
17.2.4. ChannelPipeline的outbound事件…………………………………………. 406
17.3. ChannelHandler功能说明………………………………………………………………… 407
17.3.1. ChannelHandlerAdapter功能说明…………………………………………… 407
17.3.2. ByteToMessageDecoder功能说明……………………………………………. 408
17.3.3. MessageToMessageDecoder功能说明……………………………………….. 408
17.3.4. LengthFieldBasedFrameDecoder功能说明……………………………….. 409
17.3.5. MessageToByteEncoder功能说明……………………………………………. 412
17.3.6. MessageToMessageEncoder功能说明……………………………………….. 413
17.3.7. LengthFieldPrepender功能说明……………………………………………. 413
17.4. ChannelHandler源码分析………………………………………………………………… 414
17.4.1. ChannelHandler的类继承关系图……………………………………………. 414
17.4.2. ByteToMessageDecoder源码分析……………………………………………. 415
17.4.3. MessageToMessageDecoder源码分析……………………………………….. 418
17.4.4. LengthFieldBasedFrameDecoder源码分析……………………………….. 419
17.4.5. MessageToByteEncoder源码分析……………………………………………. 424
17.4.6. MessageToMessageEncoder源码分析……………………………………….. 424
17.4.7. LengthFieldPrepender源码分析……………………………………………. 426
17.5. 总结…………………………………………………………………………………………….. 427
第 18 章EventLoop和 EventLoopGroup…………………………………………………………. 428
18.1. Netty的线程模型…………………………………………………………………………… 429
18.1.1. Reactor单线程模型……………………………………………………………… 429
18.1.2. Reactor多线程模型……………………………………………………………… 430
18.1.3. 主从Reactor多线程模型………………………………………………………. 431
18.1.4. Netty的线程模型…………………………………………………………………. 432
18.1.5. 最佳实践…………………………………………………………………………….. 433
18.2. NioEventLoop源码分析………………………………………………………………….. 434
18.2.1. NioEventLoop设计原理…………………………………………………………. 434
18.2.2. NioEventLoop继承关系类图…………………………………………………… 435
18.2.3. NioEventLoop………………………………………………………………………. 435
18.3. 总结…………………………………………………………………………………………….. 445
第 19 章Future和 Promise……………………………………………………………………………. 446
19.1. Future功能…………………………………………………………………………………… 447
19.1.1. ChannelFuture功能介绍……………………………………………………….. 447
19.2. ChannelFuture源码分析…………………………………………………………………. 451
19.2.1. AbstractFuture…………………………………………………………………… 452
19.3. Promise功能介绍…………………………………………………………………………… 453
19.4. Promise 源码分析………………………………………………………………………….. 455
19.4.1. Promise继承关系图……………………………………………………………… 455
19.4.2. DefaultPromise…………………………………………………………………… 456
19.5. 总结…………………………………………………………………………………………….. 458
第 20 章Java多线程编程在Netty中的应用……………………………………………………… 460
20.1. JAVA内存模型与多线程编程…………………………………………………………… 461
20.1.1. 硬件的发展和多任务处理………………………………………………………. 461
20.1.2. JAVA内存模型……………………………………………………………………… 461
20.2. Netty的并发编程实践…………………………………………………………………….. 463
20.2.1. 对共享的可变数据进行正确的同步………………………………………….. 463
20.2.2. 正确的使用锁………………………………………………………………………. 464
20.2.3. volatile的正确使用……………………………………………………………. 465
20.2.4. CAS指令和原子类…………………………………………………………………. 468
20.2.5. 线程安全类的应用………………………………………………………………… 470
20.2.6. 读写锁的应用………………………………………………………………………. 473
20.2.7. 线程安全性文档说明…………………………………………………………….. 475
20.2.8. 不要依赖线程优先级…………………………………………………………….. 475
20.3. 总结…………………………………………………………………………………………….. 476
第 21 章Netty的架构剖析…………………………………………………………………………….. 477
21.1. Netty逻辑架构………………………………………………………………………………. 478
21.1.1. Reactor通信调度层……………………………………………………………… 478
21.1.2. 职责链ChannelPipeline……………………………………………………….. 478
21.1.3. 业务逻辑编排层(Service ChannelHandler)………………………….. 479
21.2. 关键架构质量属性…………………………………………………………………………. 479
21.2.1. 高性能………………………………………………………………………………… 479
21.2.2. 可靠性………………………………………………………………………………… 482
21.2.3. 可定制性…………………………………………………………………………….. 485
21.2.4. 可扩展性…………………………………………………………………………….. 485
21.3. 总结…………………………………………………………………………………………….. 486
第 22 章Netty的行业应用…………………………………………………………………………….. 487
22.1. Netty在互联网行业的应用………………………………………………………………. 488
22.1.1. 传统垂直架构面临的问题………………………………………………………. 488
22.1.2. 阿里分布式服务框架Dubbo……………………………………………………. 488
22.1.3. Dubbo的架构介绍…………………………………………………………………. 489
22.1.4. Netty在Dubbo中的应用……………………………………………………….. 492
22.1.5. Dubbo框架集成Netty源码分析……………………………………………… 494
22.2. Netty在大数据领域的应用………………………………………………………………. 498
22.3. Netty在游戏行业的应用…………………………………………………………………. 499
22.3.1. 游戏服务端架构介绍…………………………………………………………….. 499
22.3.2. Netty在游戏服务端的应用……………………………………………………. 503
22.4. 总结…………………………………………………………………………………………….. 504
第 23 章Netty未来展望……………………………………………………………………………….. 505
23.1. 应用范围………………………………………………………………………………………. 506
23.2. 技术演进………………………………………………………………………………………. 506
23.3. 社区活跃度…………………………………………………………………………………… 506
23.4. Road Map……………………………………………………………………………………… 506
23.5. 总结…………………………………………………………………………………………….. 507
附录 A Netty 参数配置表…………………………………………………………………………….. 508