●基礎篇 走進Java NIO 章 Java 的I/O 演進之路......2 1.1 I/O 基礎入門......3 1.1.1 Linux 網絡I/O 模型簡介......3 1.1.2 I/O 多路復用技術......6 1.2 Java 的I/O 演進......8 1.3 總結...... 10 第2 章 NIO 入門...... 11 2.1 傳統的BIO 編程...... 11 2.1.1 BIO 通信模型圖...... 12 2.1.2 同步阻塞式I/O 創建的TimeServer 源碼分析...... 13 2.1.3 同步阻塞式I/O 創建的TimeClient 源碼分析...... 16 2.2 偽異步I/O 編程...... 18 2.2.1 偽異步I/O 模型圖...... 19 2.2.2 偽異步I/O 創建的TimeServer 源碼分析...... 19 2.2.3 偽異步I/O 弊端分析...... 21 2.3 NIO 編程...... 24 2.3.1 NIO 類庫簡介...... 24 2.3.2 NIO 服務端序列圖...... 28 2.3.3 NIO 創建的TimeServer 源碼分析...... 30 2.3.4 NIO 客戶端序列圖...... 36 2.3.5 NIO 創建的TimeClient 源碼分析...... 39 2.4 AIO 編程...... 45 2.4.1 AIO 創建的TimeServer 源碼分析...... 46 2.4.2 AIO 創建的TimeClient 源碼分析...... 51 2.4.3 AIO 版本時間服務器運行結果...... 56 2.5 4 種I/O 的對比...... 58 2.5.1 概念澄清...... 58 2.5.2 不同I/O 模型對比...... 59 2.6 選擇Netty 的理由...... 60 2.6.1 不選擇Java 原生NIO 編程的原因...... 61 2.6.2 為什麼選擇Netty ...... 62 2.7 總結...... 63 入門篇 Netty NIO 開發指南 第3 章 Netty 入門應用...... 66 3.1 Netty 開發環境的搭建...... 66 3.1.1 Netty 的軟件包...... 67 3.1.2 搭建Netty 應用工程...... 67 3.2 Netty 服務端開發...... 68 3.3 Netty 客戶端開發...... 73 3.4 運行和調試...... 76 3.4.1 服務端和客戶端的運行...... 76 3.4.2 打包和部署...... 77 3.5 總結...... 77 第4 章 TCP 粘包/拆包問題的解決之道...... 79 4.1 TCP 粘包/拆包...... 79 4.1.1 TCP 粘包/拆包問題說明...... 80 4.1.2 TCP 粘包/拆包發生的原因...... 80 4.1.3 粘包問題的解決策略...... 81 4.2 未考慮TCP 粘包導致功能異常案例...... 82 4.2.1 TimeServer 的改造...... 82 4.2.2 TimeClient 的改造...... 83 4.2.3 運行結果...... 84 4.3 利用LineBasedFrameDecoder 解決TCP 粘包問題...... 85 4.3.1 支持TCP 粘包的TimeServer ...... 86 4.3.2 支持TCP 粘包的TimeClient...... 88 4.3.3 運行支持TCP 粘包的時間服務器程序...... 90 4.3.4 LineBasedFrameDecoder 和StringDecoder 的原理分析...... 91 4.4 總結...... 92 第5 章 分隔符和定長解碼器的應用...... 93 5.1 DelimiterBasedFrameDecoder 應用開發...... 94 5.1.1 DelimiterBasedFrameDecoder 服務端開發...... 94 5.1.2 DelimiterBasedFrameDecoder 客戶端開發...... 97 5.1.3 運行DelimiterBasedFrameDecoder 服務端和客戶端...... 99 5.2 FixedLengthFrameDecoder 應用開發...... 101 5.2.1 FixedLengthFrameDecoder 服務端開發...... 101 5.2.2 利用telnet 命令行測試EchoServer 服務端...... 103 5.3 總結...... 104 中級篇 Netty 編解碼開發指南 第6 章 編解碼技術...... 106 6.1 Java 序列化的缺點...... 107 6.1.1 無法跨語言...... 107 6.1.2 序列化後的碼流太大...... 107 6.1.3 序列化性能太低...... 110 6.2 業界主流的編解碼框架...... 113 6.2.1 Google 的Protobuf 介紹...... 113 6.2.2 Facebook 的Thrift 介紹...... 115 6.2.3 JBoss Marshalling 介紹...... 116 6.3 總結...... 117 第7 章 MessagePack 編解碼...... 118 7.1 MessagePack 介紹...... 118 7.1.1 MessagePack 多語言支持...... 119 7.1.2 MessagePack Java API 介紹...... 119 7.1.3 MessagePack 開發包...... 120 7.2 MessagePack 編碼器和解碼器開發...... 120 7.2.1 MessagePack 編碼器開發...... 120 7.2.2 MessagePack 解碼器開發...... 121 7.2.3 功能測試...... 121 7.3 粘包/半包支持...... 124 7.4 總結...... 127 第8 章 Google Protobuf 編解碼...... 128 8.1 Protobuf 的入門...... 129 8.1.1 Protobuf 開發環境搭建...... 129 8.1.2 Protobuf 編解碼開發...... 131 8.1.3 運行Protobuf 例程...... 133 8.2 Netty 的Protobuf 服務端開發...... 133 8.2.1 Protobuf 版本的圖書訂購服務端開發...... 134 8.2.2 Protobuf 版本的圖書訂購客戶端開發...... 136 8.2.3 Protobuf 版本的圖書訂購程序功能測試...... 139 8.3 Protobuf 的使用注意事項...... 140 8.4 總結...... 142 第9 章 JBoss Marshalling 編解碼...... 143 9.1 Marshalling 開發環境準備...... 143 9.2 Netty 的Marshalling 服務端開發...... 144 9.3 Netty 的Marshalling 客戶端開發...... 147 9.4 運行Marshalling 客戶端和服務端例程...... 149 9.5 總結...... 150 不錯篇 Netty 多協議開發和應用 0 章 HTTP 協議開發應用...... 154 10.1 HTTP 協議介紹...... 155 10.1.1 HTTP 協議的URL ...... 155 10.1.2 HTTP 請求消息(HttpRequest)...... 155 10.1.3 HTTP 響應消息(HttpResponse) ...... 158 10.2 Netty HTTP 服務端入門開發...... 159 10.2.1 HTTP 服務端例程場景描述...... 160 10.2.2 HTTP 服務端開發...... 160 10.2.3 Netty HTTP 文件服務器例程運行結果...... 166 10.3 Netty HTTP+XML 協議棧開發...... 170 10.3.1 開發場景介紹...... 171 10.3.2 HTTP+XML 協議棧設計...... 174 10.3.3 高效的XML 綁定框架JiBx ...... 175 10.3.4 HTTP+XML 編解碼框架開發...... 183 10.3.5 HTTP+XML 協議棧測試...... 199 10.3.6 小結...... 201 10.4 總結...... 202 1 章 WebSocket 協議開發...... 203 11.1 HTTP 協議的弊端...... 204 11.2 WebSocket 入門...... 204 11.2.1 WebSocket 背景...... 205 11.2.2 WebSocket 連接建立...... 206 11.2.3 WebSocket 生命周期...... 207 11.2.4 WebSocket 連接關閉...... 208 11.3 Netty WebSocket 協議開發...... 209 11.3.1 WebSocket 服務端功能介紹...... 209 11.3.2 WebSocket 服務端開發...... 210 11.3.3 運行WebSocket 服務端...... 218 11.4 總結...... 219 2 章 私有協議棧開發...... 221 12.1 私有協議介紹...... 221 12.2 Netty 協議棧功能設計...... 223 12.2.1 網絡拓撲圖...... 223 12.2.2 協議棧功能描述...... 224 12.2.3 通信模型...... 224 12.2.4 消息定義...... 225 12.2.5 Netty 協議支持的字段類型...... 226 12.2.6 Netty 協議的編解碼規範...... 227 12.2.7 鏈路的建立...... 229 12.2.8 鏈路的關閉...... 230 12.2.9 可靠性設計...... 230 12.2.10 安全性設計...... 232 12.2.11 可擴展性設計...... 232 12.3 Netty 協議棧開發...... 233 12.3.1 數據結構定義...... 233 12.3.2 消息編解碼...... 237 12.3.3 握手和安全認證...... 241 12.3.4 心跳檢測機制...... 245 12.3.5 斷連重連...... 248 12.3.6 客戶端代碼...... 249 12.3.7 服務端代碼...... 251 12.4 運行協議棧...... 252 12.4.1 正常場景...... 252 12.4.2 異常場景:服務端宕機重啟...... 253 12.4.3 異常場景:客戶端宕機重啟...... 256 12.5 總結...... 256 3 章 服務端創建...... 258 13.1 原生NIO 類庫的復雜性...... 259 13.2 Netty 服務端創建源碼分析...... 259 13.2.1 Netty 服務端創建時序圖...... 260 13.2.2 Netty 服務端創建源碼分析...... 263 13.3 客戶端接入源碼分析...... 272 13.4 總結...... 275 4 章 客戶端創建...... 276 14.1 Netty 客戶端創建流程分析...... 276 14.2.1 Netty 客戶端創建時序圖...... 276 14.2.2 Netty 客戶端創建流程分析...... 277 14.2 Netty 客戶端創建源碼分析...... 278 14.2.1 客戶端連接輔助類Bootstrap...... 278 14.2.2 客戶端連接操作...... 281 14.2.3 異步連接結果通知...... 283 14.2.4 客戶端連接超時機制...... 284 14.3 總結...... 286 源碼分析篇 Netty 功能介紹和源碼分析 5 章 ByteBuf 和相關輔助類...... 288 15.1 ByteBuf 功能說明...... 288 15.1.1 ByteBuf 的工作原理...... 289 15.1.2 ByteBuf 的功能介紹...... 294 15.2 ByteBuf 源碼分析...... 308 15.2.1 ByteBuf 的主要類繼承關繫...... 309 15.2.2 AbstractByteBuf 源碼分析...... 310 15.2.3 AbstractReferenceCountedByteBuf 源碼分析...... 319 15.2.4 UnpooledHeapByteBuf 源碼分析...... 321 15.2.5 PooledByteBuf 內存池原理分析...... 326 15.2.6 PooledDirectByteBuf 源碼分析...... 329 15.3 ByteBuf 相關的輔助類功能介紹...... 332 15.3.1 ByteBufHolder...... 332 15.3.2 ByteBufAllocator ...... 333 15.3.3 CompositeByteBuf ...... 334 15.3.4 ByteBufUtil ...... 336 15.4 總結...... 337 6 章 Channel 和Unsafe ...... 338 16.1 Channel 功能說明...... 338 16.1.1 Channel 的工作原理...... 339 16.1.2 Channel 的功能介紹...... 340 16.2 Channel 源碼分析...... 343 16.2.1 Channel 的主要繼承關繫類圖...... 343 16.2.2 AbstractChannel 源碼分析...... 344 16.2.3 AbstractNioChannel 源碼分析...... 347 16.2.4 AbstractNioByteChannel 源碼分析...... 350 16.2.5 AbstractNioMessageChannel 源碼分析...... 353 16.2.6 AbstractNioMessageServerChannel 源碼分析...... 354 16.2.7 NioServerSocketChannel 源碼分析...... 355 16.2.8 NioSocketChannel 源碼分析...... 358 16.3 Unsafe 功能說明...... 364 16.4 Unsafe 源碼分析...... 365 16.4.1 Unsafe 繼承關繫類圖...... 365 16.4.2 AbstractUnsafe 源碼分析...... 366 16.4.3 AbstractNioUnsafe 源碼分析...... 375 16.4.4 NioByteUnsafe 源碼分析...... 379 16.5 總結...... 387 7 章 ChannelPipeline 和ChannelHandler...... 388 17.1 ChannelPipeline 功能說明...... 389 17.1.1 ChannelPipeline 的事件處理...... 389 17.1.2 自定義攔截器...... 391 17.1.3 構建pipeline ...... 392 17.1.4 ChannelPipeline 的主要特性...... 393 17.2 ChannelPipeline 源碼分析...... 393 17.2.1 ChannelPipeline 的類繼承關繫圖...... 393 17.2.2 ChannelPipeline 對ChannelHandler 的管理...... 393 17.2.3 ChannelPipeline 的inbound 事件...... 396 17.2.4 ChannelPipeline 的outbound 事件...... 397 17.3 ChannelHandler 功能說明...... 398 17.3.1 ChannelHandlerAdapter 功能說明...... 399 17.3.2 ByteToMessageDecoder 功能說明...... 399 17.3.3 MessageToMessageDecoder 功能說明...... 400 17.3.4 LengthFieldBasedFrameDecoder 功能說明...... 400 17.3.5 MessageToByteEncoder 功能說明...... 404 17.3.6 MessageToMessageEncoder 功能說明...... 404 17.3.7 LengthFieldPrepender 功能說明...... 405 17.4 ChannelHandler 源碼分析...... 406 17.4.1 ChannelHandler 的類繼承關繫圖...... 406 17.4.2 ByteToMessageDecoder 源碼分析...... 407 17.4.3 MessageToMessageDecoder 源碼分析...... 410 17.4.4 LengthFieldBasedFrameDecoder 源碼分析...... 411 17.4.5 MessageToByteEncoder 源碼分析...... 415 17.4.6 MessageToMessageEncoder 源碼分析...... 416 17.4.7 LengthFieldPrepender 源碼分析...... 417 17.5 總結...... 418 8 章 EventLoop 和EventLoopGroup...... 419 18.1 Netty 的線程模型...... 419 18.1.1 Reactor 單線程模型...... 420 18.1.2 Reactor 多線程模型...... 421 18.1.3 主從Reactor 多線程模型...... 422 18.1.4 Netty 的線程模型...... 423 18.1.5 最佳實踐...... 424 18.2 NioEventLoop 源碼分析...... 425 18.2.1 NioEventLoop 設計原理...... 425 18.2.2 NioEventLoop 繼承關繫類圖...... 426 18.2.3 NioEventLoop...... 427 18.3 總結...... 436 9 章 Future 和Promise ...... 438 19.1 Future 功能...... 438 19.2 ChannelFuture 源碼分析...... 443 19.3 Promise 功能介紹...... 445 19.4 Promise 源碼分析...... 447 19.4.1 Promise 繼承關繫圖...... 447 19.4.2 DefaultPromise ...... 447 19.5 總結...... 449 架構和行業應用篇 Netty 不錯特性 第20 章 Netty 架構剖析...... 452 20.1 Netty 邏輯架構...... 452 20.1.1 Reactor 通信調度層...... 453 20.1.2 職責鏈ChannelPipeline ...... 453 20.1.3 業務邏輯編排層(Service ChannelHandler)...... 454 20.2 關鍵架構質量屬性...... 454 20.2.1 高性能...... 454 20.2.2 可靠性...... 457 20.2.3 可定制性...... 460 20.2.4 可擴展性...... 460 20.3 總結...... 460 第21 章 Java 多線程編程在Netty 中的應用...... 461 21.1 Java 內存模型與多線程編程...... 461 21.1.1 硬件的發展和多任務處理...... 461 21.1.2 Java 內存模型...... 462 21.2 Netty 的並發編程實踐...... 464 21.2.1 對共享的可變數據進行正確的同步...... 464 21.2.2 正確使用鎖...... 465 21.2.3 volatile 的正確使用...... 467 21.2.4 CAS 指令和原子類...... 470 21.2.5 線程安全類的應用...... 472 21.2.6 讀寫鎖的應用...... 476 21.2.7 線程安全性文檔說明...... 477 21.2.8 不要依賴線程優先級...... 478 21.3 總結...... 479 第22 章 高性能之道...... 480 22.1 RPC 調用性能模型分析...... 480 22.1.1 傳統RPC 調用性能差的三宗罪...... 480 22.1.2 I/O 通信性能三原則...... 481 22.2 Netty 高性能之道...... 482 22.2.1 異步非阻塞通信...... 482 22.2.2 高效的Reactor 線程模型...... 482 22.2.3 無鎖化的串行設計...... 485 22.2.4 高效的並發編程...... 486 22.2.5 高性能的序列化框架...... 486 22.2.6 零拷貝...... 487 22.2.7 內存池...... 491 22.2.8 靈活的TCP 參數配置能力...... 494 22.3 主流NIO 框架性能對比...... 495 22.4 總結...... 497 第23 章 可靠性...... 498 23.1 可靠性需求...... 498 23.1.1 宕機的代價...... 498 23.1.2 Netty 可靠性需求...... 499 23.2 Netty 高可靠性設計...... 500 23.2.1 網絡通信類故障...... 500 23.2.2 鏈路的有效性檢測...... 507 23.2.3 Reactor 線程的保護...... 510 23.2.4 內存保護...... 513 23.2.5 流量整形...... 516 23.2.6 優雅停機接口...... 519 23.3 優化建議...... 520 23.3.1 發送隊列容量上限控制...... 520 23.3.2 回推發送失敗的消息...... 521 23.4 總結...... 521 第24 章 安全性...... 522 24.1 嚴峻的安全形勢...... 522 24.1.1 OpenSSL Heart bleed 漏洞...... 522 24.1.2 安全漏洞的代價...... 523 24.1.3 Netty 面臨的安全風險...... 523 24.2 Netty SSL 安全特性...... 525 24.2.1 SSL 單向認證...... 525 24.2.2 SSL 雙向認證...... 532 24.2.3 第三方CA 認證...... 536 24.3 Netty SSL 源碼分析...... 538 24.3.1 客戶端...... 538 24.3.2 服務端...... 541 24.3.3 消息讀取...... 544 24.3.4 消息發送...... 545 24.4 Netty 擴展的安全特性...... 546 24.4.1 IP 地址黑名單機制...... 547 24.4.2 接入認證...... 548 24.4 總結...... 550 第25 章 Netty 未來展望...... 551 25.1 應用範圍...... 551 25.2 技術演進...... 552 25.3 社區活躍度...... 552 25.4 Road Map ...... 552 25.5 總結...... 553 附錄A Netty 參數配置表...... 554
內容簡介
《Netty 很好不錯指南(第2 版)》是異步非阻塞通信領域的經典之作,基於很新版本的Netty 5.0 編寫,是靠前首本深入介紹Netty 原理和架構的書籍,也是作者多年實戰經驗的總結和濃縮。內容不僅包含Java NIO入門知識、Netty 的基礎功能開發指導、編解碼框架定制等,還包括私有協議棧定制和開發、Netty 核心類庫源碼分析,以及Netty 的架構剖析。