基礎篇走進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 源碼分析................ 30
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 源碼分析................ 51
2.4.3 AIO 版本時間服務器運行結果.................... 56
2.5 4 種I/O 的對比......... 58
2.5.1 概念澄清.......... 58
2.5.2 不同I/O 模型對比.............. 59
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 總結............................ 77
第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 粘包問題................ 85
4.3.1 支持TCP 粘包的TimeServer ....................... 86
4.3.2 支持TCP 粘包的TimeClient........................ 88
4.3.3 運行支持TCP 粘包的時間服務器程序........ 90
4.3.4 LineBasedFrameDecoder 和StringDecoder 的原理分析........... 91
4.4 總結............................ 92
第5 章分隔符和定長解碼器的應用...... 93
5.1 DelimiterBasedFrameDecoder 應用開發............. 94
5.1.1 DelimiterBasedFrameDecoder 服務端開發.... 94
5.1.2 DelimiterBasedFrameDecoder 客戶端開發.... 97
5.1.3 運行DelimiterBasedFrameDecoder 服務端和客戶端............... 99
5.2 FixedLengthFrameDecoder 應用開發............... 101
5.2.1 FixedLengthFrameDecoder 服務端開發...... 101
5.2.2 利用telnet 命令行測試EchoServer 服務端......103
5.3 總結.......................... 104
中級篇 Netty 編解碼開發指南
第6 章編解碼技術.............. 106
6.1 Java 序列化的缺點 ...... 107
6.1.1 無法跨語言.... 107
6.1.2 序列化後的碼流太大........ 107
6.1.3 序列化性能太低................ 110
6.2 業界主流的編解碼框架............ 113
6.2.1 Google 的Protobuf 介紹.... 113
6.2.2 Facebook 的Thrift 介紹.... 115
6.2.3 JBoss Marshalling 介紹..... 116
6.3 總結.......................... 117
第7 章MessagePack 編解碼............... 118
7.1 MessagePack 介紹... 118
7.1.1 MessagePack 多語言支持.. 119
7.1.2 MessagePack Java API 介紹........................ 119
7.1.3 MessagePack 開發包下載. 120
7.2 MessagePack 編碼器和解碼器開發................. 120
7.2.1 MessagePack 編碼器開發....... 120
7.2.2 MessagePack 解碼器開發 ...... 121
7.2.3 功能測試........ 121
7.3 粘包/半包支持......... 124
7.4 總結.......................... 127
第8 章Google Protobuf 編解碼.......... 128
8.1 Protobuf 的入門....... 129
8.1.1 Protobuf 開發環境搭建..... 129
8.1.2 Protobuf 編解碼開發......... 131
8.1.3 運行Protobuf 例程............ 133
8.2 Netty 的Protobuf 服務端開發.. 133
8.2.1 Protobuf 版本的圖書訂購服務端開發........ 134
8.2.2 Protobuf 版本的圖書訂購客戶端開發........ 136
8.2.3 Protobuf 版本的圖書訂購程序功能測試.... 139
8.3 Protobuf 的使用注意事項......... 140
8.4 總結.......................... 142
第9 章JBoss Marshalling 編解碼....... 143
9.1 Marshalling 開發環境準備........ 143
9.2 Netty 的Marshalling 服務端開發..................... 144
9.3 Netty 的Marshalling 客戶端開發..................... 147
9.4 運行Marshalling 客戶端和服務端例程........... 149
9.5 總結.......................... 150
高級篇 Netty 多協議開發和應用
第10 章HTTP 協議開發應用............... 154
10.1 HTTP 協議介紹..... 155
10.1.1 HTTP 協議的URL .......... 155
10.1.2 HTTP 請求消息(HttpRequest).............. 155
10.1.3 HTTP 響應消息(HttpResponse)........... 158
10.2 Netty HTTP 服務端入門開發....... 159
10.2.1 HTTP 服務端例程場景描述..................... 160
10.2.2 HTTP 服務端開發........... 160
10.2.3 Netty HTTP 文件服務器例程運行結果.... 166
10.3 Netty HTTP+XML 協議棧開發....................... 170
10.3.1 開發場景介紹................. 171
10.3.2 HTTP+XML 協議棧設計.......174
10.3.3 高效的XML 綁定框架JiBx ..................... 175
10.3.4 HTTP+XML 編解碼框架開發.................. 183
10.3.5 HTTP+XML 協議棧測試....... 199
10.3.6 小結............. 201
10.4 總結........................ 202
第11 章WebSocket 協議開發............. 203
11.1 HTTP 協議的弊端....... 204
11.2 WebSocket 入門..... 204
11.2.1 WebSocket 背景............... 205
11.2.2 WebSocket 連接建立....... 206
11.2.3 WebSocket 生命周期....... 207
11.2.4 WebSocket 連接關閉....... 208
11.3 Netty WebSocket 協議開發..... 209
11.3.1 WebSocket 服務端功能介紹..................... 209
11.3.2 WebSocket 服務端開發.... 210
11.3.3 運行WebSocket 服務端... 218
11.4 總結........................ 219
第12 章私有協議棧開發.... 221
12.1 私有協議介紹........ 221
12.2 Netty 協議棧功能設計............ 223
12.2.1 網絡拓撲圖.. 223
12.2.2 協議棧功能描述.............. 224
12.2.3 通信模型...... 224
12.2.4 消息定義...... 225
12.2.5 Netty 協議支持的字段類型...................... 226
12.2.6 Netty 協議的編解碼規範. 227
12.2.7 鏈路的建立.. 229
12.2.8 鏈路的關閉.. 230
12.2.9 可靠性設計.. 230
12.2.10 安全性設計 232
12.2.11 可擴展性設計................ 232
12.3 Netty 協議棧開發.. 233
12.3.1 數據結構定義................. 233
12.3.2 消息編解碼.. 237
12.3.3 握手和安全認證.............. 241
12.3.4 心跳檢測機製................. 245
12.3.5 斷連重連...... 248
12.3.6 客戶端代碼.. 249
12.3.7 服務端代碼.. 251
12.4 運行協議棧............ 252
12.4.1 正常場景...... 252
12.4.2 異常場景:服務端宕機重啓.................... 253
12.4.3 異常場景:客戶端宕機重啓.................... 256
12.5 總結........................ 256
第13 章服務端創建............ 258
13.1 原生NIO 類庫的復雜性......... 259
13.2 Netty 服務端創建源碼分析.... 259
13.2.1 Netty 服務端創建時序圖. 260
13.2.2 Netty 服務端創建源碼分析...................... 263
13.3 客戶端接入源碼分析.............. 272
13.4 總結........................ 275
第14 章客戶端創建............ 276
14.1 Netty 客戶端創建流程分析.... 276
14.2.1 Netty 客戶端創建時序圖. 276
14.2.2 Netty 客戶端創建流程分析...................... 277
14.2 Netty 客戶端創建源碼分析.... 278
14.2.1 客戶端連接輔助類Bootstrap.................... 278
14.2.2 客戶端連接操作.............. 281
14.2.3 異步連接結果通知.......... 283
14.2.4 客戶端連接超時機製...... 284
14.3 總結........................ 286
源碼分析篇 Netty 功能介紹和源碼分析
第15 章ByteBuf 和相關輔助類........... 288
15.1 ByteBuf 功能說明. 288
15.1.1 ByteBuf 的工作原理........ 289
15.1.2 ByteBuf 的功能介紹........ 294
15.2 ByteBuf 源碼分析. 308
15.2.1 ByteBuf 的主要類繼承關係..................... 309
15.2.2 AbstractByteBuf 源碼分析........................ 310
15.2.3 AbstractReferenceCountedByteBuf 源碼分析.................. 319
15.2.4 UnpooledHeapByteBuf 源碼分析.............. 321
15.2.5 PooledByteBuf 內存池原理分析............... 326
15.2.6 PooledDirectByteBuf 源碼分析................. 329
15.3 ByteBuf 相關的輔助類功能介紹.................... 332
15.3.1 ByteBufHolder................. 332
15.3.2 ByteBufAllocator ............. 333
15.3.3 CompositeByteBuf ........... 334
15.3.4 ByteBufUtil .. 336
15.4 總結........................ 337
第16 章Channel 和Unsafe ................. 338
16.1 Channel 功能說明. 338
16.1.1 Channel 的工作原理........ 339
16.1.2 Channel 的功能介紹........ 340
16.2 Channel 源碼分析. 343
16.2.1 Channel 的主要繼承關係類圖.................. 343
16.2.2 AbstractChannel 源碼分析........................ 344
16.2.3 AbstractNioChannel 源碼分析.................. 347
16.2.4 AbstractNioByteChannel 源碼分析........... 350
16.2.5 AbstractNioMessageChannel 源碼分析..... 353
16.2.6 AbstractNioMessageServerChannel 源碼分析.............. 354
16.2.7 NioServerSocketChannel 源碼分析........... 355
16.2.8 NioSocketChannel 源碼分析..................... 358
16.3 Unsafe 功能說明... 364
16.4 Unsafe 源碼分析... 365
16.4.1 Unsafe 繼承關係類圖...... 365
16.4.2 AbstractUnsafe 源碼分析. 366
16.4.3 AbstractNioUnsafe 源碼分析.................... 375
16.4.4 NioByteUnsafe 源碼分析. 379
16.5 總結........................ 387
第17 章ChannelPipeline 和ChannelHandler........... 388
17.1 ChannelPipeline 功能說明....... 389
17.1.1 ChannelPipeline 的事件處理.................... 389
17.1.2 自定義攔截器................. 391
17.1.3 構建pipeline 392
17.1.4 ChannelPipeline 的主要特性.................... 393
17.2 ChannelPipeline 源碼分析....... 393
17.2.1 ChannelPipeline 的類繼承關係圖............. 393
17.2.2 ChannelPipeline 對ChannelHandler 的管理........... 393
17.2.3 ChannelPipeline 的inbound 事件.............. 396
17.2.4 ChannelPipeline 的outbound 事件............ 397
17.3 ChannelHandler 功能說明....... 398
17.3.1 ChannelHandlerAdapter 功能說明............ 399
17.3.2 ByteToMessageDecoder 功能說明............ 399
17.3.3 MessageToMessageDecoder 功能說明...... 400
17.3.4 LengthFieldBasedFrameDecoder 功能說明............... 400
17.3.5 MessageToByteEncoder 功能說明............. 404
17.3.6 MessageToMessageEncoder 功能說明....... 404
17.3.7 LengthFieldPrepender 功能說明............... 405
17.4 ChannelHandler 源碼分析....... 406
17.4.1 ChannelHandler 的類繼承關係圖............. 406
17.4.2 ByteToMessageDecoder 源碼分析............ 407
17.4.3 MessageToMessageDecoder 源碼分析...... 410
17.4.4 LengthFieldBasedFrameDecoder 源碼分析............ 411
17.4.5 MessageToByteEncoder 源碼分析............. 415
17.4.6 MessageToMessageEncoder 源碼分析....... 416
17.4.7 LengthFieldPrepender 源碼分析............... 417
17.5 總結........................ 418
第18 章EventLoop 和EventLoopGroup.................... 419
18.1 Netty 的綫程模型.. 419
18.1.1 Reactor 單綫程模型......... 420
18.1.2 Reactor 多綫程模型......... 421
18.1.3 主從Reactor 多綫程模型 422
18.1.4 Netty 的綫程模型............ 423
18.1.5 最佳實踐...... 424
18.2 NioEventLoop 源碼分析......... 425
18.2.1 NioEventLoop 設計原理.. 425
18.2.2 NioEventLoop 繼承關係類圖................... 426
18.2.3 NioEventLoop.................. 427
18.3 總結........................ 436
第19 章Future 和Promise .................. 438
19.1 Future 功能............ 438
19.2 ChannelFuture 源碼分析......... 443
19.3 Promise 功能介紹. 445
19.4 Promise 源碼分析. 447
19.4.1 Promise 繼承關係圖........ 447
19.4.2 DefaultPromise ................ 447
19.5 總結........................ 449
架構和行業應用篇 Netty 高級特性
第20 章Netty 架構剖析..... 452
20.1 Netty 邏輯架構...... 452
20.1.1 Reactor 通信調度層......... 453
20.1.2 職責鏈ChannelPipeline ... 453
20.1.3 業務邏輯編排層(Service ChannelHandler)........... 454
20.2 關鍵架構質量屬性.................. 454
20.2.1 高性能.......... 454
20.2.2 可靠性.......... 457
20.2.3 可定製性...... 460
20.2.4 可擴展性...... 460
20.3 總結........................ 460
第21 章Java 多綫程編程在Netty 中的應用............. 461
21.1 Java 內存模型與多綫程編程.. 461
21.1.1 硬件的發展和多任務處理........................ 461
21.1.2 Java 內存模型................. 462
21.2 Netty 的並發編程實踐............ 464
21.2.1 對共享的可變數據進行正確的同步......... 464
21.2.2 正確使用鎖.. 465
21.2.3 volatile 的正確使用......... 467
21.2.4 CAS 指令和原子類......... 470
21.2.5 綫程安全類的應用.......... 472
21.2.6 讀寫鎖的應用................. 476
21.2.7 綫程安全性文檔說明...... 477
21.2.8 不要依賴綫程優先級...... 478
21.3 總結........................ 479
第22 章高性能之道............ 480
22.1 RPC 調用性能模型分析.......... 480
22.1.1 傳統RPC 調用性能差的三宗罪............... 480
22.1.2 I/O 通信性能三原則........ 481
22.2 Netty 高性能之道.. 482
22.2.1 異步非阻塞通信.............. 482
22.2.2 高效的Reactor 綫程模型 482
22.2.3 無鎖化的串行設計.......... 485
22.2.4 高效的並發編程.............. 486
22.2.5 高性能的序列化框架...... 486
22.2.6 零拷貝.......... 487
22.2.7 內存池.......... 491
22.2.8 靈活的TCP 參數配置能力....................... 494
22.3 主流NIO 框架性能對比......... 495
22.4 總結........................ 497
第23 章可靠性.................... 498
23.1 可靠性需求............ 498
23.1.1 宕機的代價.. 498
23.1.2 Netty 可靠性需求............ 499
23.2 Netty 高可靠性設計................ 500
23.2.1 網絡通信類故障.............. 500
23.2.2 鏈路的有效性檢測.......... 507
23.2.3 Reactor 綫程的保護......... 510
23.2.4 內存保護...... 513
23.2.5 流量整形...... 516
23.2.6 優雅停機接口................. 519
23.3 優化建議................ 520
23.3.1 發送隊列容量上限控製... 520
23.3.2 迴推發送失敗的消息...... 521
23.4 總結........................ 521
第24 章安全性.................... 522
24.1 嚴峻的安全形勢.... 522
24.1.1 OpenSSL Heart bleed 漏洞.......... 522
24.1.2 安全漏洞的代價.............. 523
24.1.3 Netty 麵臨的安全風險..... 523
24.2 Netty SSL 安全特性................. 525
24.2.1 SSL 單嚮認證.................. 525
24.2.2 SSL 雙嚮認證.................. 532
24.2.3 第三方CA 認證.............. 536
24.3 Netty SSL 源碼分析................. 538
24.3.1 客戶端.......... 538
24.3.2 服務端.......... 541
24.3.3 消息讀取...... 544
24.3.4 消息發送...... 545
24.4 Netty 擴展的安全特性............ 546
24.4.1 IP 地址黑名單機製.......... 547
24.4.2 接入認證...... 548
24.4 總結........................ 550
第25 章Netty 未來展望..... 551
25.1 應用範圍................ 551
25.2 技術演進................ 552
25.3 社區活躍度............ 552
25.4 Road Map ............... 552
25.5 總結........................ 553
附錄A Netty 參數配置錶.... 554
· · · · · · (
收起)