Netty進階之路:跟著案例學Netty ( 簡體 字) |
作者:李林鋒 | 類別:1. -> 程式設計 -> JAVA |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 50201 詢問書籍請說出此書號!【缺書】 NT售價: 395 元 |
出版日:11/1/2018 |
頁數:340 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121352621 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:序1
隨著近幾年的快速發展,移動互聯網系統的復雜度快速上升。為了滿足業務快速迭代的需求,同時提高系統的可靠性和可維護性,越來越多的大型系統后臺開始采用微服務架構。以華為應用市場為例,目前后臺微服務數量達上百個,服務器多達數千臺。服務器數量的快速增加,必然導致后臺系統復雜度的快速增加,從而推動后臺技術架構的持續演進。 在單體系統中,一個請求通常只涉及一個部件。但微服務化后,一個請求可能涉及數個微服務的配合。傳統的后臺服務通常采用同步阻塞調用方式,一個請求獨占一個線程,只有在請求處理完成后,線程才能被釋放。如果一個請求涉及多個微服務之間的調用,那么每個微服務都需要一個專門的連接和線程來處理這個請求。而系統的線程數和連接數都是有限的。當系統調用關系越來越復雜,一個很小的問題(如網絡抖動、突發請求或GC引起的延時增加),都可能導致線程阻塞,引發雪崩,導致整個系統不可用。另一方面,同步阻塞的方式很容易導致系統的資源利用率降低。因此,業界領先的互聯網公司,都已經或者正在切換到全棧異步方式。 相比同步I/O簡單直接的編程模型,異步I/O在編程模型上有較大的差異,對開發人員也有更高的要求,同時問題的定位也更為復雜。Netty是當前業界應用最廣泛的Java開源異步框架。Netty框架能顯著降低異步開發的門檻,使開發人員聚焦業務邏輯,免于處理復雜的底層通信機制和線程模型,從而能夠簡單和快速地開發異步應用。時至今日,越來越多的國內公司開始使用Netty來構建應用,使用Netty的開發者也日益增加。 隨著Netty應用的不斷深入,大家在使用過程中也會遇到各種各樣的問題。相比Netty的火熱,市場上Netty相關的書籍卻很少。作者幾年前出版的著作《Netty權威指南》是國內第一本系統化講解Netty原理和架構的書籍,在市場上取得了良好的反響。《Netty進階之路:跟著案例學Netty》是作者在Netty方面的又一力作。該書從一個個典型的問題出發,讓讀者能夠帶著問題來展開學習,并通過代碼解讀、原理分析和問題總結,對每個問題抽絲剝繭地深入解析;同時,能夠通過一個問題,將相關領域的知識理解透徹,達到舉一反三的效果,進而實現對Netty的系統性學習與理解。 李林鋒在電信軟件行業有著近十年的異步和服務化方面的開發和架構設計經驗,是華為公司該領域的專家。他從2017年開始負責華為應用市場在異步和微服務化方面的工作,主導了華為應用市場后臺的異步化和微服務化演進,將電信軟件嚴謹、穩定、高性能的優勢,與移動互聯網海量用戶、高并發場景結合起來,顯著提升了華為應用市場的可用性和性能。本書凝結了作者多年來在異步化工作方面的經驗,將成為希望精通Netty開發的讀者的重要參考書。
華為應用市場總架構師 劉連喜
序2
隨著互聯網對各行各業的滲透,“連接”便成了我們看到的所有美好應用背后的基石。人、系統、物三者之間無所不在的連接讓我們甚至感覺這世界已經成為了一個整體。細數一些計算機領域的熱門技術,例如云計算、微服務、物聯網等,其背后的核心還是連接。在這樣一個背景下,掌握Netty可以算得上是一個開發人員最重要的技能。 就像碼農的學名其實是計算機工程師一樣,計算機其實是一個工程學科,是一個天生看重實踐的學科。在現在的環境里,各種技術文檔在網上一抓一大把,但是仍然有一些東西很難得到,那就是你需要填的那些坑。 李林鋒長期工作在技術一線,構建的是壓力最大的系統,保證的是要求最高的服務,解決的是詭異難解的問題。而難能可貴的是,他把他自己填過的那些坑都詳盡地記錄了下來,不僅提供思路,還分析原理,讓所有問題都無所遁形。 《Netty進階之路:跟著案例學Netty》就是能夠助人出坑的干貨。 佛教的修行次第是“信,解,行,證”。李林鋒一直以來對技術的熱情、“知行合一”的行事方式和對問題刨根問底的工作態度非常難得,相信通過這本書也可以讓你由“解”入“行”,他趟過那些大坑的經驗也一定會助你早日在Netty學習的路上實現“自證”。
華為云高級架構師 張琦
前 言
自2014年《Netty權威指南》出版后,我在技術網站上相繼寫了一些Netty專題文章,涵蓋性能、線程模型、安全性等知識點,受到很多讀者的喜愛。在4年多里,很多讀者及Netty學習者向我咨詢Netty相關的問題,這些問題加起來多達上千個,通過對問題做匯總和分析,可以歸納為如下幾類: (1)Netty初學者,想了解學習Netty需要儲備哪些技能,掌握哪些知識點,有什么學習技巧可以更快地掌握Netty。 (2)《Netty權威指南》的讀者,學習完理論知識后,想在實際項目中使用,但是真正跟具體項目結合在一起解決實際問題時,又感覺比較棘手,不知道自己使用的方式是否是最優的,希望能夠多學一些案例實踐方面的知識,以便更好地在業務中使用Netty。 (3)在實際項目中遇到了問題的工程師,由于對Netty底層細節掌握得不扎實,無法有效地定位并解決問題。 Netty的一個特點就是入門相對容易,但是真正掌握并精通是非常困難的,原因有如下幾個: (1)涉及的知識面比較廣。Netty作為一個高性能的NIO通信框架,涉及的知識點包括網絡通信、多線程編程、序列化和反序列化、異步和同步、SSL/TLS安全、內存池、HTTP等各種協議棧,這些知識點在Java語言中本身就是難點和重點,如果對這些基礎知識掌握不扎實,是很難真正掌握好Netty的。 (2)調試比較困難。因為大量使用異步編程接口,以及消息處理過程中的各種線程切換,相比傳統同步代碼,Netty代碼調試難度比較大。 (3)類繼承層次比較深,有些代碼很晦澀(例如內存池)。對于初學者而言,通過閱讀代碼來掌握Netty的難度還是很大的。 (4)代碼規模龐大。目前,Netty的代碼規模已經非常龐大,特別是協議棧部分,提供了對HTTP/2、MQTT、WebSocket等各種協議的支持,相關代碼非常多。如果學習方式不當,抓不住重點,則全量閱讀Netty源碼,既耗時又很難吃透,很容易半途而廢。 (5)資料零散,缺乏與實踐相關的案例。網上Netty的各種資料非常多,但是都以理論講解為主,Netty在各行業中的應用、問題定位技巧及案例實踐方面的資料很少,缺乏系統性的實踐總結,是Netty學習的一大痛點。 在過去的幾年中,我利用業余時間盡量幫大家答疑解惑,但實際上一個人很難回答所有讀者的問題,有些問題需要業務描述、故障場景、日志,甚至要看源碼,而且需要反復多次溝通來弄清楚問題,對于個人而言,時間和精力都很難得到保證。另外,一些比較常見的問題,例如服務端接收不到客戶端的消息,定位手段是可以固化下來的。很多讀者也希望我能寫一本Netty實踐和案例方面的書,通過案例講解讓大家更好地在項目中使用Netty,解決遇到的實際問題。 于是我對手頭大家咨詢的問題做了歸類分析,結合我們自己的業務和平臺多年來在Netty實踐中積累的經驗,寫作了本書。本書以問題案例做牽引,通過對案例進行剖析,講解問題背后的原理,并結合Netty源碼分析,讓讀者能夠真正掌握Netty,在實際工作中少犯錯。在案例的分析過程中,還穿插講解了Netty的問題定位思路、方法、技巧,以及解決問題使用的相關工具,“授人以魚不如授人以漁”,只有掌握了這些才能在項目中更放心地使用Netty。 本書的內容分類主要包括: (1)Netty的啟動和停止 (2)Netty的內存 (3)Netty的并發多線程 (4)Netty的性能 (5)Netty的可靠性 (6)Netty的安全 (7)Netty的實踐 (8)Netty的學習 書中的案例涵蓋了Netty絕大多數常用的功能,以及容易犯錯的地方,具有通用性和普遍性。學習這些案例,對于在實際業務工作中用好Netty具有很大的幫助和啟發作用。另外,在講解Netty框架本身的同時,也會穿插一些背景知識介紹,例如Java信號量和優雅停機機制、Java的NIO類庫、HTTP協議棧等。知識都是相互關聯的,很難在基礎知識不扎實的情況下掌握更高階的知識。 通過本書的學習,希望廣大Netty初學者和愛好者能夠更快、更好地進入高級階段,在項目中用好Netty,為業務創造更多的價值。 盡管我也有技術潔癖,希望諸事完美,但是由于Netty代碼的龐雜和涉及的知識點太多,以及受限于我個人的經歷和水平,很難在一本書里同時滿足所有讀者的訴求。本書如有遺漏或者錯誤,懇請大家及時批評和指正,如果大家有好的建議或者想法,也可以聯系我。聯系方式如下: 微信:Nettying 新浪微博:Nettying 能夠完成本書要感謝很多人,首先感謝華為公司給我提供了足夠大的舞臺,感謝華為消費者云服務應用市場團隊領導張凡、葉文武、劉連喜等,以及這些年與我在平臺和業務團隊一起戰斗過的架構師、設計師、開發工程師、測試工程師和資料員等同事。 其次感謝我的家人,你們一直在背后默默地支持我。感謝參與本書編輯的英姐、美工及其他人員,你們的辛苦換來了本書的如期上市。 最后感謝所有《Netty權威指南》和《分布式服務框架原理與實踐》的讀者,你們的支持和鼓勵是我寫作本書的動力源泉。
李林鋒 2018年國慶節于南京 |
內容簡介: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.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 |
序: |