Netty 進階之路 : 跟著案例學 Netty
內容描述
Netty將Java NIO接口封裝,提供了全異步編程方式,是各大Java項目的網絡應用開發必備神器。本書作者是國內Netty技術的先行者和佈道者,本書是他繼《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.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 Protob
作者介紹
李林鋒
10年Java NIO通信框架、平台中間件架構設計和開發經驗。
目前在華為終端應用市場負責業務微服務化、雲化、全球化等相關設計和開發工作。
《Netty權威指南》和《分佈式服務框架原理與實踐》作者。