Netty 原理剖析與實戰

Netty 原理剖析與實戰

作者: 傅健
出版社: 人民郵電
出版在: 2021-11-01
ISBN-13: 9787115567635
ISBN-10: 7115567638
裝訂格式: 平裝
總頁數: 398 頁





內容描述


本書旨在介紹Netty框架的原理和應用。本書首先介紹了什麽是Netty,Netty的發展史,創建Netty應用程序所必備的基礎知識,然後從參數調整、診斷性優化、性能優化等方面對Netty進行源碼解析並討論如何完善案例程序,最後講述UDP應用、HTTP應用、文件應用和Netty編程思想。
本書適合有一定Java基礎的架構師、設計師、開發工程師、測試工程師,以及對Netty感興趣的相關人士閱讀。


目錄大綱


第一部分 源碼解析與實戰入門
第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


作者介紹


傅健,認證網絡工程師、信息系統項目管理師,思科(中國)研發中心軟件工程師。擁有十年以上Java研發經驗,專注於高性能平台服務器的開發,是Netty、Spring Data、Influxdb-java、Jenkins等開源項目的貢獻者,著有《微服務之道:度量驅動開發》。




相關書籍

Spring Cloud 開發實戰 (視頻講解版)

作者 李興華 馬雲濤

2021-11-01

C# 入門經典, 9/e

作者 Benjamin Perkins Jon D. Reid 齊立博 譯

2021-11-01

Classical Fortran: Programming for Engineering and Scientific Applications, 2/e (Hardcover)

作者 Michael Kupferschmid

2021-11-01