《Netty進階之路:跟著案例學Netty》是電子工業出版社於2019年出版的圖書,作者是李林鋒。
基本介紹
- 書名:《Netty進階之路:跟著案例學Netty》
- 作者:李林鋒
- ISBN:9787121352621
- 頁數:304
- 定價:79
- 出版社:電子工業出版社
- 出版時間:2019-01-01
- 開本:16開
圖書簡介,圖書目錄,
圖書簡介
Netty將Java NIO接口封裝,提供了全異步編程方式,是各大Java項目的網路套用開發必備神器。本書作者是國內Netty技術的先行者和布道者,本書是他的又一力作。在本書中,作者將在過去幾年實踐中遇到的問題,以及Netty學習者諮詢的相關問題,進行了歸納和總結,以問題案例做牽引,通過對案例進行剖析,講解問題背後的原理,並結合Netty源碼分析,讓讀者能夠真正掌握Netty,在實際工作中少犯錯。本書中的案例涵蓋了Netty的啟動和停止、記憶體、並發多執行緒、性能、可靠性、安全等方面,囊括了Netty絕大多數常用的功能及容易讓人犯錯的地方。在案例的分析過程中,還穿插講解了Netty的問題定位思路、方法、技巧,以及解決問題使用的相關工具,對讀者在實際工作中用好Netty具有很大的幫助和啟發作用。本書適合架構師、設計師、開發工程師、測試工程師,以及對Java NIO框架、Netty感興趣的其他相關人士閱讀。
圖書目錄
第1章 Netty服務端意外退出案例 1
1.1 Netty服務端意外退出問題 1
1.1.1 Java Daemon執行緒簡介 2
1.1.2 Netty服務端啟動原理 4
1.1.3 如何防止Netty服務端意外退出 6
1.1.4 實際項目中的最佳化策略 8
1.2 Netty優雅退出機制 9
1.2.1 Java優雅退出機制 10
1.2.2 Java優雅退出的注意點 12
1.2.3 Netty優雅退出機制 14
1.2.4 Netty優雅退出原理和源碼分析 15
1.2.5 Netty優雅退出的一些誤區 20
1.3 總結 21
第2章 Netty客戶端連線池資源泄漏案例 22
2.1 Netty連線池資源泄漏問題 22
2.1.1 連線池創建代碼 23
2.1.2 記憶體溢出和執行緒膨脹 23
2.1.3 錯用NIO編程模式 25
2.1.4 正確的連線池創建方式 26
2.1.5 並發安全和資源釋放 28
2.2 Netty客戶端創建機制 29
2.2.1 Java NIO客戶端創建原理分析 29
2.2.2 Netty客戶端創建原理分析 32
2.2.3 Bootstrap工具類源碼分析 34
2.3 總結 36
第3章 Netty記憶體池泄漏疑雲案例 37
3.1 Netty記憶體池泄漏問題 37
3.1.1 路由轉發服務代碼 38
3.1.2 回響訊息記憶體釋放玄機 39
3.1.3 採集堆記憶體快照分析 42
3.1.4 ByteBuf申請和釋放的理解誤區 45
3.2 Netty記憶體池工作機制 48
3.2.1 記憶體池的性能優勢 48
3.2.2 記憶體池工作原理分析 51
3.2.3 記憶體池核心代碼分析 54
3.3 總結 58
第4章 ByteBuf故障排查案例 59
4.1 HTTP協定棧ByteBuf使用問題 59
4.1.1 HTTP回響Body獲取異常 59
4.1.2 ByteBuf非法引用問題 63
4.1.3 ByteBuf使用注意事項 66
4.2 Netty ByteBuf實現機制 67
4.2.1 Java原生ByteBuffer的局限性 67
4.2.2 Netty ByteBuf工作原理分析 67
4.2.3 ByteBuf引用計數器工作原理和源碼分析 70
4.3 總結 73
第5章 Netty傳送佇列積壓導致記憶體泄漏案例 74
5.1 Netty傳送佇列積壓案例 74
5.1.1 高並發故障場景 74
5.1.2 記憶體泄漏原因分析 76
5.1.3 如何防止傳送佇列積壓 78
5.1.4 其他可能導致傳送佇列積壓的因素 80
5.2 Netty訊息傳送工作機制 82
5.2.1 WriteAndFlushTask原理和源碼分析 83
5.2.2 ChannelOutboundBuffer原理和源碼分析 86
5.2.3 訊息傳送源碼分析 88
5.2.4 訊息傳送高低水位控制 94
5.3 總結 95
第6章 API網關高並發壓測性能波動案例 96
6.1 高並發壓測性能波動問題 96
6.1.1 故障場景模擬 96
6.1.2 性能波動原因定位 98
6.1.3 主動記憶體泄漏定位法 101
6.1.4 網關類產品的最佳化建議 102
6.2 Netty訊息接入記憶體申請機制 102
6.2.1 訊息接入的記憶體分配原理和源碼分析 102
6.2.2 Netty ByteBuf的動態擴容原理和源碼分析 107
6.3 總結 108
第7章 Netty ChannelHandler並發安全案例 109
7.1 Netty ChannelHandler並發安全問題 109
7.1.1 串列執行的ChannelHandler 110
7.1.2 跨鏈路共享的ChannelHandler 114
7.1.3 ChannelHandler的並發陷阱 116
7.2 Netty ChannelHandler工作機制 118
7.2.1 職責鏈ChannelPipeline原理和源碼分析 118
7.2.2 用戶自定義Event原理和源碼分析 122
7.3 總結 123
第8章 車聯網服務端接收不到車載終端訊息案例 124
8.1 車聯網服務端接收不到車載終端訊息問題 124
8.1.1 故障現象 125
8.1.2 故障期執行緒堆疊快照分析 126
8.1.3 NioEventLoop執行緒防掛死策略 128
8.2 NioEventLoop執行緒工作機制 129
8.2.1 I/O讀寫操作原理和源碼分析 130
8.2.2 異步任務執行原理和源碼分析 133
8.2.3 定時任務執行原理和源碼分析 135
8.2.4 Netty多執行緒最佳實踐 137
8.3 總結 137
第9章 Netty 3.X版本升級案例 139
9.1 Netty 3.X的版本升級背景 139
9.1.1 被迫升級場景 140
9.1.2 升級不當遭遇各種問題 140
9.2 版本升級後數據被篡改問題 141
9.2.1 數據篡改原因分析 142
9.2.2 問題總結 143
9.3 升級後上下文丟失問題 143
9.3.1 上下文丟失原因分析 144
9.3.2 依賴第三方執行緒模型的思考 144
9.4 升級後套用遭遇性能下降問題 145
9.4.1 性能下降原因分析 145
9.4.2 性能最佳化建議 146
9.5 Netty執行緒模型變更分析 147
9.5.1 Netty 3.X版本執行緒模型 147
9.5.2 Netty 4.X版本執行緒模型 149
9.5.3 執行緒模型變化點源碼分析 150
9.5.4 執行緒模型變化總結 152
9.6 總結 154
第10章 Netty並發失效導致性能下降案例 155
10.1 業務ChannelHandler無法並發執行問題 155
10.1.1 服務端並發設計相關代碼分析 155
10.1.2 無法並行執行的EventExecutorGroup 159
10.1.3 並行執行最佳化策略和結果 161
10.2 Netty DefaultEventExecutor工作機制 163
10.2.1 DefaultEventExecutor原理和源碼分析 164
10.2.2 業務執行緒池最佳化策略 165
10.2.3 Netty執行緒綁定機制原理和源碼分析 168
10.3 總結 170
第11章 IoT百萬長連線性能調優案例 171
11.1 海量長連線接入面臨的挑戰 171
11.1.1 IoT設備接入特點 172
11.1.2 IoT服務端性能最佳化場景 172
11.1.3 服務端面臨的性能挑戰 172
11.2 智慧型家居記憶體泄漏問題 173
11.2.1 服務端記憶體泄漏原因定位 173
11.2.2 問題背後的一些思考 174
11.3 作業系統參數調優 174
11.3.1 檔案描述符 175
11.3.2 TCP/IP相關參數 175
11.3.3 多網卡佇列和軟中斷 177
11.4 Netty性能調優 177
11.4.1 設定合理的執行緒數 177
11.4.2 心跳最佳化 180
11.4.3 接收和傳送緩衝區調優 183
11.4.4 合理使用記憶體池 184
11.4.5 防止I/O執行緒被意外阻塞 185
11.4.6 I/O執行緒和業務執行緒分離 187
11.4.7 針對端側並發連線數的流控 187
11.5 JVM相關性能最佳化 189
11.5.1 GC調優 189
11.5.2 其他最佳化手段 193
11.6 總結 193
第12章 靜態檢查修改不當引起性能下降案例 195
12.1 Edge Service性能嚴重下降問題 195
12.1.1 Edge Service熱點代碼分析 195
12.1.2 靜態檢查問題不是簡單的一改了之 197
12.1.3 問題反思和改進 200
12.2 克隆和淺拷貝 201
12.2.1 淺拷貝存在的問題 201
12.2.2 Netty的對象拷貝實現策略 203
12.3 總結 204
第13章 Netty性能統計誤區案例 205
13.1 時延毛刺排查相關問題 205
13.1.1 時延毛刺問題初步分析 205
13.1.2 服務調用鏈改進 207
13.1.3 都是同步思維惹的禍 208
13.1.4 正確的訊息傳送速度性能統計策略 209
13.1.5 常見的訊息傳送性能統計誤區 212
13.2 Netty關鍵性能指標採集策略 212
13.2.1 Netty I/O執行緒池性能指標 213
13.2.2 Netty傳送佇列積壓訊息數 214
13.2.3 Netty訊息讀取速度性能統計 215
13.3 總結 215
第14章 gRPC的Netty HTTP/2實踐案例 216
14.1 gRPC基礎入門 216
14.1.1 RPC框架簡介 216
14.1.2 當前主流的RPC框架 218
14.1.3 gRPC框架特點 218
14.1.4 為什麼選擇HTTP/2 219
14.2 gRPC Netty HTTP/2服務端工作機制 220
14.2.1 Netty HTTP/2服務端創建原理和源碼分析 220
14.2.2 服務端接收HTTP/2請求訊息原理和源碼分析 224
14.2.3 服務端傳送HTTP/2回響訊息原理和源碼分析 231
14.3 gRPC Netty HTTP/2客戶端工作機制 234
14.3.1 Netty HTTP/2客戶端創建原理和源碼分析 235
14.3.2 客戶端傳送HTTP/2請求訊息原理和源碼分析 238
14.3.3 客戶端接收HTTP/2回響訊息原理和源碼分析 242
14.4 gRPC訊息序列化機制 243
14.4.1 Google Protobuf簡介 243
14.4.2 訊息的序列化原理和源碼分析 244
14.4.3 訊息的反序列化原理和源碼分析 245
14.5 gRPC執行緒模型 246
14.5.1 服務端執行緒模型 246
14.5.2 客戶端執行緒模型 247
14.5.3 執行緒模型總結 248
14.6 總結 249
第15章 Netty事件觸發策略使用不當案例 250
15.1 channelReadComplete方法被調用多次問題 250
15.1.1 ChannelHandler調用問題 250
15.1.2 生產環境問題模擬重現 252
15.2 ChannelHandler使用的一些誤區總結 255
15.2.1 channelReadComplete方法調用 255
15.2.2 ChannelHandler職責鏈調用 257
15.3 總結 258
第16章 Netty流量整形套用案例 259
16.1 Netty流量整形功能 259
16.1.1 通用的流量整形功能簡介 260
16.1.2 Netty流量整形功能簡介 260
16.2 Netty流量整形套用 261
16.2.1 流量整形示例代碼 261
16.2.2 流量整形功能測試 263
16.3 Netty流量整形工作機制 264
16.3.1 流量整形工作原理和源碼分析 264
16.3.2 並發編程在流量整形中的套用 271
16.3.3 使用流量整形的一些注意事項總結 274
16.4 總結 278
第17章 Netty SSL套用案例 279
17.1 Netty SSL功能簡介 279
17.1.1 SSL安全特性 280
17.1.2 Netty SSL實現機制 281
17.2 Netty客戶端SSL握手逾時問題 282
17.2.1 握手逾時原因定位 282
17.2.2 Netty SSL握手問題定位技巧 283
17.3 SSL握手性能問題 284
17.3.1 SSL握手性能熱點分析 284
17.3.2 快取和對象池 285
17.4 SSL事件監聽機制 286
17.4.1 握手成功事件 286
17.4.2 SSL連線關閉事件 286
17.5 總結 287
第18章 Netty HTTPS服務端高並發宕機案例 288
18.1 Netty HTTPS服務端宕機問題 288
18.1.1 客戶端大量逾時 288
18.1.2 服務端記憶體泄漏原因分析 289
18.1.3 NioSocketChannel泄漏原因探究 290
18.1.4 高並發場景下缺失的可靠性保護 292
18.2 功能層面的可靠性最佳化 294
18.2.1 Netty HTTPS服務端可靠性最佳化 295
18.2.2 HTTPS客戶端最佳化 296
18.3 架構層面的可靠性最佳化 297
18.3.1 端到端架構問題剖析 297
18.3.2 HTTP Client切換到NIO 298
18.3.3 同步RPC調用切換到異步調用 299
18.3.4 協定升級到HTTP/2 303
18.4 總結 307
第19章 MQTT服務接入逾時案例 308
19.1 MQTT服務接入逾時問題 308
19.1.1 生產環境問題現象 308
19.1.2 連線數膨脹原因分析 309
19.1.3 無效連線的關閉策略 309
19.1.4 問題總結 310
19.2 基於Netty的可靠性設計 311
19.2.1 業務定製I/O異常 311
19.2.2 鏈路的有效性檢測 312
19.2.3 記憶體保護 313
19.3 總結 315
第20章 Netty實踐總結 316
20.1 Netty學習策略 316
20.1.1 入門知識準備 316
20.1.2 Netty入門學習 319
20.1.3 項目實踐 319
20.1.4 Netty源碼閱讀策略 319
20.2 Netty故障定位技巧 320
20.2.1 接收不到訊息 320
20.2.2 記憶體泄漏 321
20.2.3 性能問題 322
20.3 總結 322