《Netty 4核心原理與手寫RPC框架實戰》首先從硬件層面深入分析網絡通信原理,結合Java對網絡I/O的API實現,將理論與實踐串聯起來,幫助大家透徹理解網絡通信的起源,然后介紹Netty產生的背景并基于Netty手寫Tomcat和RPC框架,幫助大家初步了解Netty的作用,接著分析Netty的核心原理和核心組件,基于Netty手寫一個消息推送系統并進行性能調優,最后介紹設計模式在Netty中的應用和經典的面試題分析。如果你想深入了解網絡通信原理,如果你還不知道Netty能做什么,如果你想深入了解Netty的實現原理,如果你看源碼找不到入口,無從下手,如果你想了解設計模式在Netty中的應用,本書都能幫到你。
譚勇德(Tom)10余年Java開發經驗。咕泡學院聯合創始人。著有暢銷書《Spring 5核心原理與30個類手寫實戰》。在大型IT公司擔任過CTO、系統架構師。精通Java、JS、CSS、AS、PHP等;負責過多個大型分布式系統的微服務架構的技術改造;多年來對Netty框架有深入研究及獨特見解;開發過多套企業內部UI框架和ORM框架;熱衷于分享經驗,共同進步。格言:不只做一個技術者,更要做一個思考者。
目錄
第 1 篇 I/O 基礎篇
第 1 章 網絡通信原理................................................................................................................... 2
1.1 網絡基礎架構 .......................................................................................................................... 2
1.1.1 C/S 架構 ............................................................................................................................... 2
1.1.2 C/S 信息傳輸流程 ................................................................................................................. 2
1.2 TCP/IP 五層模型詳解 ............................................................................................................. 3
1.2.1 物理層 .................................................................................................................................... 3
1.2.2 數據鏈路層 .................................................................................................................................. 4
1.2.3 網絡層 ........................................................................................................................................ 5
1.2.4 傳輸層 ................................................................................................................................ 10
1.2.5 應用層 ....................................................................................................................................... 15
1.2.6 小結 ............................................................................................................................................ 16
1.3 網絡通信實現原理 ................................................................................................................ 18
1.4 向瀏覽器輸入 URL 后發生了什么 .................................................................................... 19
1.5 網絡通信之“魂”——Socket ...............................................................................................21
第 2 章 Java I/O 演進之路 ........................................................................................................23
2.1 I/O 的問世 ............................................................................................................................. 23
2.1.1 什么是 I/O ................................................................................................................................. 23
2.1.2 I/O 交互流程 .............................................................................................................................. 24
2.2 五種 I/O 通信模型 ...................................................................................................................... 25
2.2.1 阻塞 I/O 模型 .......................................................................................................................... 25
2.2.2 非阻塞 I/O 模型 ....................................................................................................................... 26
2.2.3 多路復用 I/O 模型 .................................................................................................................... 27
2.2.4 信號驅動 I/O 模型 ................................................................................................................... 28
2.2.5 異步 I/O 模型 ............................................................................................................................. 28
2.2.6 易混淆的概念澄清 ..................................................................................................................... 29
2.2.7 各 I/O 模型的對比與總結 ....................................................................................................... 32
2.3 從 BIO 到 NIO 的演進 ........................................................................................................ 33
2.3.1 面向流與面向緩沖 ..................................................................................................................... 33
2.3.2 阻塞與非阻塞 ............................................................................................................................. 33
2.3.3 選擇器在 I/O 中的應用 ............................................................................................................ 34
2.3.4 NIO 和 BIO 如何影響應用程序的設計 ........................................................................................ 34
2.4 Java AIO 詳解 ......................................................................................................................... 37
2.4.1 AIO 基本原理 ............................................................................................................................. 37
2.4.2 AIO 初體驗 ................................................................................................................................ 38
第 2 篇 Netty 初體驗
第 3 章 Netty 與 NIO 之前世今生 ........................................................................................... 44
3.1 Java NIO 三件套 .................................................................................................................... 44
3.1.1 緩沖區 ........................................................................................................................................ 44
3.1.2 選擇器 ........................................................................................................................................ 54
3.1.3 通道 ............................................................................................................................................ 58
3.2 NIO 源碼初探 ........................................................................................................................ 63
3.3 反應堆 ..................................................................................................................................... 69
3.4 Netty 與 NIO .......................................................................................................................... 70
3.4.1 Netty 支持的功能與特性 ............................................................................................................ 70
3.4.2 Netty 采用 NIO 而非 AIO 的理由 ................................................................................................ 71
第 4 章 基于 Netty 手寫 Tomcat................................................................................................... 72
4.1 環境準備 ................................................................................................................................. 72
4.1.1 定義 GPServlet 抽象類 ............................................................................................................ 72
4.1.2 創建用戶業務代碼 ..................................................................................................................... 73
4.1.3 完成 web.properties 配置 ......................................................................................................... 74
4.2 基于傳統 I/O 手寫 Tomcat ................................................................................................... 74
4.2.1 創建 GPRequest 對象 ............................................................................................................... 74
4.2.2 創建 GPResponse 對象 ........................................................................................................... 76
4.2.3 創建 GPTomcat 啟動類 .............................................................................................................. 77
4.3 基于 Netty 重構 Tomcat 實現 ............................................................................................ 80
4.3.1 重構 GPTomcat 邏輯 ................................................................................................................. 80
4.3.2 重構 GPRequest 邏輯 ............................................................................................................... 83
4.3.3 重構 GPResponse 邏輯 ............................................................................................................ 84
4.3.4 運行效果演示 ....................................................................................................................................... 85
第 5 章 基于 Netty 重構 RPC 框架 .......................................................................................... 87
5.1 RPC 概述 ................................................................................................................................ 87
5.2 環境預設 ................................................................................................................................. 88
5.3 代碼實戰 ................................................................................................................................. 91
5.3.1 創建 API 模塊 ..................................................................................................................................... 91
5.3.2 創建自定義協議 ................................................................................................................................... 91
5.3.3 實現 Provider 業務邏輯 ..................................................................................................................... 92
5.3.4 完成 Registry 服務注冊 ..................................................................................................................... 93
5.3.5 實現 Consumer 遠程調用 ................................................................................................................... 97
5.3.6 Monitor 監控 ....................................................................................................................................... 101
5.4 運行效果演示 ....................................................................................................................... 102
第 3 篇 Netty 核心篇
第 6 章 Netty 高性能之道 ........................................................................................................... 104
6.1 背景介紹 ............................................................................................................................... 104
6.1.1 Netty 驚人的性能數據 ....................................................................................................................... 104
6.1.2 傳統 RPC 調用性能差的“三宗罪”................................................................................................... 104
6.1.3 Netty 高性能的三個主題 ................................................................................................................... 105
6.2 Netty 高性能之核心法寶 .................................................................................................... 106
6.2.1 異步非阻塞通信 ................................................................................................................................. 106
6.2.2 零拷貝 ................................................................................................................................................. 108
6.2.3 內存池 ................................................................................................................................................. 112
6.2.4 高效的 Reactor 線程模型 ................................................................................................................. 116
6.2.5 無鎖化的串行設計理念 ..................................................................................................................... 118
6.2.6 高效的并發編程 ................................................................................................................................. 119
6.2.7 對高性能的序列化框架的支持 ......................................................................................................... 119
6.2.8 靈活的 TCP 參數配置能力 .............................................................................................................. 120
第 7 章 揭開 Bootstrap 的神秘面紗............................................................................................ 124
7.1 客戶端 Bootstrap .................................................................................................................. 124
7.1.1 Channel 簡介 ...................................................................................................................................... 124
7.1.2 NioSocketChannel 的創建 .................................................................................................................. 125
7.1.3 客戶端 Channel 的初始化 ................................................................................................................ 127
7.1.4 Unsafe 屬性的初始化 ......................................................................................................................... 130
7.1.5 ChannelPipeline 的初始化 .................................................................................................................. 131
7.1.6 EventLoop 的初始化 .......................................................................................................................... 132
7.1.7 將 Channel 注冊到 Selector .............................................................................................................. 137
7.1.8 Handler 的添加過程 ........................................................................................................................... 139
7.1.9 客戶端發起連接請求 ......................................................................................................................... 141
7.2 服務端 ServerBootstrap ........................................................................................................ 144
7.2.1 NioServerSocketChannel 的創建 ....................................................................................................... 146
7.2.2 服務端 Channel 的初始化 ................................................................................................................ 146
7.2.3 服務端 ChannelPipeline 的初始化 ................................................................................................... 149
7.2.4 將服務端 Channel 注冊到 Selector .................................................................................................. 149
7.2.5 bossGroup 與 workerGroup................................................................................................................. 149
7.2.6 服務端 Selector 事件輪詢 ................................................................................................................ 152
7.2.7 Netty 解決 JDK 空輪詢 Bug............................................................................................................. 154
7.2.8 Netty 對 Selector 中 KeySet 的優化 .............................................................................................. 157
7.2.9 Handler 的添加過程 ........................................................................................................................... 160
第 8 章 大名鼎鼎的 EventLoop ................................................................................................... 164
8.1 EventLoopGroup 與 Reactor ............................................................................................... 164
8.1.1 再談 Reactor 線程模型 ..................................................................................................................... 164
8.1.2 EventLoopGroup 與 Reactor 關聯 ................................................................................................... 166
8.1.3 EventLoopGroup 的實例化 ................................................................................................................ 167
8.2 任務執行者 EventLoop ....................................................................................................... 169
8.2.1 NioEventLoop 的實例化過程 ............................................................................................................ 170
8.2.2 EventLoop 與 Channel 的關聯 ......................................................................................................... 171
8.2.3 EventLoop 的啟動 .............................................................................................................................. 172
第 9 章 Netty 大動脈 Pipeline ..................................................................................................... 176
9.1 Pipeline 設計原理 ................................................................................................................ 176
9.1.1 Channel 與 ChannelPipeline ............................................................................................................... 176
9.1.2 再談 ChannelPipeline 的初始化 ....................................................................................................... 177
9.1.3 ChannelInitializer 的添加..................................................................................................................... 178
9.1.4 自定義 ChannelHandler 的添加過程 ............................................................................................... 181
9.1.5 給 ChannelHandler 命名 ................................................................................................................... 184
9.1.6 ChannelHandler 的默認命名規則 ...................................................................................................... 185
9.2 Pipeline 的事件傳播機制 .................................................................................................... 186
9.2.1 Outbound 事件傳播方式 .................................................................................................................... 194
9.2.2 Inbound 事件傳播方式 ....................................................................................................................... 196
9.2.3 小結 ..................................................................................................................................................... 199
9.3 Handler 的各種“姿勢” ...................................................................................................... 200
9.3.1 ChannelHandlerContext ........................................................................................................................ 200
9.3.2 Channel 的生命周期 ........................................................................................................................... 201
9.3.3 ChannelHandler 常用的 API .............................................................................................................. 201
9.3.4 ChannelInboundHandler ........................................................................................................................ 202
第 10 章 異步處理雙子星 Future 與 Promise .......................................................................... 204
10.1 異步結果 Future ................................................................................................................ 204
10.2 異步執行 Promise .............................................................................................................. 205
第 11 章 Netty 內存分配 ByteBuf .............................................................................................. 209
11.1 初識 ByteBuf ...................................................................................................................... 209
11.1.1 ByteBuf 的基本結構 ......................................................................................................................... 209
11.1.2 ByteBuf 的重要 API ......................................................................................................................... 210
11.1.3 ByteBuf 的基本分類 ......................................................................................................................... 213
11.2 ByteBufAllocator 內存管理器 ........................................................................................... 214
11.3 非池化內存分配 ................................................................................................................. 218
11.3.1 堆內內存的分配 ............................................................................................................................... 218
11.3.2 堆外內存的分配 ............................................................................................................................... 221
11.4 池化內存分配 ..................................................................................................................... 224
11.4.1 PooledByteBufAllocator 簡述 .......................................................................................................... 224
11.4.2 DirectArena 內存分配流程 .............................................................................................................. 229
11.4.3 內存池的內存規格 ........................................................................................................................... 231
11.4.4 命中緩存的分配 ............................................................................................................................... 231
11.4.5 Page 級別的內存分配 ...................................................................................................................... 241
11.4.6 SubPage 級別的內存分配 ................................................................................................................ 254
11.4.7 內存池 ByteBuf 的內存回收 .......................................................................................................... 268
11.4.8 SocketChannel 讀取 ByteBuf 的過程 ............................................................................................ 273
第 12 章 Netty 編解碼的藝術 ..................................................................................................... 281
12.1 什么是拆包、粘包 ............................................................................................................. 281
12.1.1 TCP 拆包、粘包 ................................................................................................................................ 281
12.1.2 粘包問題的解決策略 ....................................................................................................................... 282
12.2 什么是編解碼 ..................................................................................................................... 282
12.2.1 編解碼技術 ....................................................................................................................................... 282
12.2.2 Netty 為什么要提供編解碼框架 ..................................................................................................... 283
12.3 Netty 中常用的解碼器 ...................................................................................................... 284
12.3.1 ByteToMessageDecoder 抽象解碼器 ............................................................................................... 284
12.3.2 LineBasedFrameDecoder 行解碼器 ................................................................................................. 289
12.3.3 DelimiterBasedFrameDecoder 分隔符解碼器 ................................................................................. 296
12.3.4 FixedLengthFrameDecoder 固定長度解碼器 .................................................................................. 302
12.3.5 LengthFieldBasedFrameDecoder 通用解碼器 ................................................................................. 303
12.4 Netty 編碼器原理和數據輸出 ........................................................................................... 307
12.4.1 WriteAndFlush 事件傳播 ................................................................................................................. 307
12.4.2 MessageToByteEncoder 抽象編碼器 ............................................................................................... 311
12.4.3 寫入 Buffer 隊列 ............................................................................................................................. 312
12.4.4 刷新 Buffer 隊列 ............................................................................................................................. 316
12.4.5 數據輸出回調 ................................................................................................................................... 322
12.5 自定義編解碼 ..................................................................................................................... 335
12.5.1 MessageToMessageDecoder 抽象解碼器 ........................................................................................ 335
12.5.2 MessageToMessageEncoder 抽象編碼器 ........................................................................................ 336
12.5.3 ObjectEncoder 序列化編碼器 .......................................................................................................... 337
12.5.4 LengthFieldPrepender 通用編碼器 .................................................................................................. 338
第 4 篇 Netty 實戰篇
第 13 章 基于 Netty 手寫消息推送系統 .................................................................................. 342
13.1 環境搭建 ............................................................................................................................. 342
13.2 多協議通信設計 ................................................................................................................ 343
13.2.1 自定義協議規則 ............................................................................................................................... 343
13.2.2 自定義編解碼器 ............................................................................................................................... 346
13.2.3 對 HTTP 的支持 ............................................................................................................................. 349
13.2.4 對自定義協議的支持 ....................................................................................................................... 351
13.2.5 對 WebSocket 協議的支持 ............................................................................................................. 351
13.3 服務端邏輯處理 ................................................................................................................. 352
13.3.1 多協議串行處理 ............................................................................................................................... 352
13.3.2 服務端用戶中心 ............................................................................................................................... 354
13.4 客戶端控制臺處理 ............................................................................................................. 359
13.4.1 控制臺接入代碼 ............................................................................................................................... 359
13.4.2 控制臺消息處理 ............................................................................................................................... 360
13.5 客戶端 Web 頁面交互實現 .............................................................................................. 363
13.5.1 Web 頁面設計 ................................................................................................................................... 363
13.5.2 WebSocket 接入 ................................................................................................................................ 365
13.5.3 登錄和退出 ....................................................................................................................................... 366
13.5.4 發送文字信息 ................................................................................................................................... 367
13.5.5 發送圖片表情 ................................................................................................................................... 368
13.5.6 發送鮮花雨特效 ............................................................................................................................... 369
第 14 章 Netty 高性能調優工具類解析 .................................................................................... 371
14.1 多線程共享 FastThreadLocal ............................................................................................ 371
14.1.1 FastThreadLocal 的使用和創建 ....................................................................................................... 371
14.1.2 FastThreadLocal 的設值 ................................................................................................................... 379
14.2 Recycler 對象回收站 ......................................................................................................... 381
14.2.1 Recycler 的使用和創建 ................................................................................................................... 381
14.2.2 從 Recycler 中獲取對象 ................................................................................................................. 386
14.2.3 相同線程內的對象回收 ................................................................................................................... 389
14.2.4 不同線程間的對象回收 ................................................................................................................... 391
14.2.5 獲取不同線程間釋放的對象 ........................................................................................................... 397
第 15 章 單機百萬連接性能調優 ................................................................................................ 405
15.1 模擬 Netty 單機連接瓶頸 ................................................................................................ 405
15.2 單機百萬連接調優解決思路 ............................................................................................. 410
15.2.1 突破局部文件句柄限制 ................................................................................................................... 410
15.2.2 突破全局文件句柄限制 ................................................................................................................... 412
15.3 Netty 應用級別的性能調優 ............................................................................................. 413
15.3.1 Netty 應用級別的性能瓶頸復現 ..................................................................................................... 413
15.3.2 Netty 應用級別的性能調優方案 ..................................................................................................... 420
第 16 章 設計模式在 Netty 中的應用 ...................................................................................... 422
16.1 單例模式源碼舉例 ............................................................................................................. 422
16.2 策略模式源碼舉例 ............................................................................................................. 423
16.3 裝飾者模式源碼舉例 ......................................................................................................... 424
16.4 觀察者模式源碼舉例 ......................................................................................................... 426
16.5 迭代器模式源碼舉例 ......................................................................................................... 427
16.6 責任鏈模式源碼舉例 ......................................................................................................... 428
16.7 工廠模式源碼舉例 ............................................................................................................. 430
第 17 章 Netty 經典面試題集錦................................................................................................... 432
17.1 基礎知識部分 ..................................................................................................................... 432
17.1.1 TCP 和 UDP 的根本區別 ............................................................................................................... 432
17.1.2 TCP 如何保證可靠傳輸 ................................................................................................................... 433
17.1.3 Netty 能解決什么問題 ..................................................................................................................... 433
17.1.4 選用 Netty 作為通信組件框架的舉例 .......................................................................................... 433
17.1.5 Netty 有哪些主要組件,它們之間有什么關聯 .............................................................................. 433
17.2 高級特性部分 ..................................................................................................................... 434
17.2.1 相較同類框架,Netty 有哪些優勢 ................................................................................................. 434
17.2.2 Netty 的高性能體現在哪些方面 ..................................................................................................... 434
17.2.3 默認情況下 Netty 起多少線程,何時啟動 .................................................................................. 434
17.2.4 Netty 有幾種發送消息的方式 ......................................................................................................... 434
17.2.5 Netty 支持哪些心跳類型設置 ......................................................................................................... 435
17.2.6 Netty 和 Tomcat 的區別 ................................................................................................................. 435
17.2.7 在實際應用中,如何確定要使用哪些編解碼器 ............................................................................. 435