目錄
第一部分源碼解析與實戰入門
第1章Netty初印像 2
1.1Netty的定義 2
1.2Netty並非萬能 3
1.3Netty程序是什麼樣的 4
1.3.1HTTP服務器構建案例 4
1.3.2自定義TCP服務器案例 6
1.4為什麼不直接基於JDK NIO編程 8
1.4.1Netty做得更多 8
1.4.2Netty做得更好 9
1.4.3基於JDK NIO實現難度太大 11
1.5Netty相比同類框架的優勢 13
1.5.1Apache的Mina 13
1.5.2Sun的Grizzly 13
1.5.3Apple的Swift NIO和ACE等 14
1.5.4Cindy和其他框架 14
1.6Netty的過去、現狀與發展趨勢 14
1.6.1Netty的過去 15
1.6.2Netty的現狀 16
1.6.3Netty的發展趨勢 18
第2章準備工作 19
2.1環境準備 19
2.1.1準備源碼閱讀環境 19
2.1.2準備實戰案例環境 20
2.2Netty代碼編譯及常見問題 20
2.2.1常見編譯問題一 20
2.2.2常見編譯問題二 22
2.3Netty代碼結構速覽 24
2.4本書借鋻的常用開源軟件 26
2.4.1Cassandra 26
2.4.2Dubbo 26
2.4.3Hadoop 27
2.4.4Lettuce 27
2.4.5GRPC 28
2.4.6WebFlux 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.1Cassandra 47
3.4.2Dubbo 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.1TCP 58
4.1.2UDP 60
4.2常見的消息定界方式 61
4.2.1TCP短連接方式 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.1Dubbo的幀結構 67
4.4.2Cassandra的幀結構 67
4.4.3Hadoop的幀結構 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.1Netty對網絡編程模式的支持
情況 76
5.3.2Netty對網絡編程模式的實現
要點 78
5.4常見開源軟件是如何支持網絡
編程模式的 81
5.4.1Lettuce 81
5.4.2Cassandra 83
5.5為實戰案例選擇網絡編程模式 84
5.6常見疑問和實戰易錯點解析 84
5.6.1常見疑問解析 84
5.6.2常見實戰易錯點解析 86
第6章線程模型 89
6.1NIO的3種Reactor模式 89
6.1.1Reactor單線程模式 91
6.1.2Reactor多線程模式 92
6.1.3Reactor主從多線程模式 92
6.2源碼解析Netty對3種Reactor
模式的支持 93
6.2.1如何在Netty中使用這3種
Reactor模式 93
6.2.2Netty在內部是如何支持Reactor
模式的 94
6.3Netty線程模型的可優化點 98
6.4常見開源軟件是如何使用Reactor
模式的 101
6.4.1Cassandra 101
6.4.2Dubbo 102
6.4.3Hadoop 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.2Netty繫統參數調整 150
8.1.3Netty非繫統參數調整 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.1Netty日志優化 161
9.1.1源碼解析 161
9.1.2開源案例 164
9.1.3實戰案例 166
9.2Netty的關鍵診斷信息及可視化
方案 169
9.2.1Netty的關鍵診斷信息 170
9.2.2診斷信息的可視化方案 171
9.2.3實戰案例 173
9.3Netty內存洩漏檢測 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.1Native庫的加載順序 203
10.3.2check volume for noexec flag的
含義 205
第11章繫統增強 207
11.1Netty高低水位線保護 207
11.1.1源碼解析 207
11.1.2開源案例 209
11.1.3實戰案例 210
11.2Netty流量控制保護 211
11.2.1源碼解析 212
11.2.2實戰案例 216
11.3Netty空閑監測防護 218
11.3.1源碼解析 220
11.3.2開源案例 224
11.3.3實戰案例 225
11.4常見疑問解析 228
11.4.1HTTP Keep-Alive和keepalive
之間的區別 228
11.4.2IdleStateHandler中observeOutput
的功能 228
11.4.3FileRegion的發送受高低水位線
控制嗎 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.3SSL加密 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.4OptionalSslHandler的用途和
實現方法 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.2UDP包的發送方式 288
14.4.3UDP廣播及支持 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.2ExpectContinue處理程序HttpServer-
ExpectContinueHandler 302
15.1.3請求合並器
HttpObjectAggregator 305
15.1.4其他常用的HTTP處理程序 313
15.2開源軟件如何使用Netty構建
HTTP服務 314
15.2.1Hadoop如何使用Netty構建
Web Hdfs 314
15.2.2WebFlux如何基於Netty構建
Web服務 319
15.3將案例程序改造為HTTP
應用 324
15.3.1完成業務處理程序 325
15.3.2組合處理程序以搭建HTTP
服務器 326
15.4常見疑問解析 327
15.4.1HttpServerExpectContinueHandler
和HttpObjectAggregator能否
共存 327
15.4.2何時需要寫LastHttpContent 328
15.4.3HttpChunkedInput必須與
transfer-encoding:chunked
綁定在一起嗎 331
15.4.4其他流行框架如何根據請求
定位到處理位置 332
第16章Netty對文件應用的支持 334
16.1FileRegion 334
16.1.1Netty如何支持FileRegion 335
16.1.2解析FileRegion的劣勢 337
16.2ChunkedFile/ChunkedNioFile 338
16.2.1比較ChunkedFile與
ChunkedNioFile 338
16.2.2解析ChunkedWriteHandler的
實現 339
16.3Netty文件應用案例解析 342
第17章Netty的另類特性 344
17.1Netty對虛擬機內管道提供的
支持 344
17.1.1解析JDK自帶的管道技術 344
17.1.2如何使用Netty的虛擬機內
管道 347
17.1.3基於源碼解析Netty的虛擬機內
管道 349
17.2Netty對UNIX域套接字提供的
支持 353
17.2.1如何使用Netty的域套接字 353
17.2.2基於源碼解析Netty的域
套接字 355
17.3Netty對JDK的ThreadLocal所做的
優化 359
17.3.1在Netty中如何使用
FastThreadLocal 359
17.3.2基於源碼解析ThreadLocal的
性能缺陷 360
17.3.3基於源碼解析FastThreadLocal
所做的優化 362
17.4Netty對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
附錄ANetty TCP通信支持的實現 399
附錄B一些重要術語的翻譯 400