第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
· · · · · · (
收起)