Netty權威指南

Netty權威指南

《Netty權威指南》是異步非阻塞通信領域的經典之作,基於最新版本Netty 5.0編寫,是國內首本深入介紹Netty原理和架構的技術書籍,也是作者多年實戰經驗的總結和濃縮。在理論方面,講解了Netty的邏輯架構模型和核心類庫的設計原理,而且對Netty在大數據、網際網路、遊戲行業的套用進行了深入分析;實戰方面,從第一個Netty入門程式到私有協定棧的設計和開發,通過實際例程,由淺入深地對Netty的核心API和類庫的功能和用法進行了細緻講解。本書適合架構師、設計師、軟體開發工程師、測試人員和其他對Java NIO框架、Java通信感興趣的相關人士閱讀,相信通過學習本書,能夠熟悉和掌握Netty這一優秀的異步通信框架,實現高可用分散式系統的構建。

基本介紹

內容簡介

資深一線專家誠意之作,總結多年實踐經驗,帶你全面掌握Java高並發異步通信的首選框架——Netty。
- 阿里巴巴、JBoss 、Facebook、並發編程網、唯品會、1號店等多位資深技術專家聯名力薦。
《Netty權威指南》是異步非阻塞通信領域的經典之作,是國內首本深入分析和講解Netty原理和架構的著作,內容包含基礎功能、高級套用、系統架構、源碼分析和行業套用,深入闡述了Java I/O的Netty NIO開發、Netty編解碼開發、Netty多協定開發等各方面的技術要點,包含了對源碼的深刻解讀,並且對Netty的套用現狀和未來趨勢進行分析,旨在幫助從業人員提升自我,更快更明確地發展職業道路。
Netty是什麼?使用Netty能夠做什麼?為什麼要從傳統的Socket開發切換到NIO進行編程?為什麼不直接基於JDK的NIO類庫編程而選擇Netty?如何全面系統地掌握Netty,進行Netty NIO開發、Netty編解碼開發、Netty多協定開發?如何通過對Netty源碼的學習獲得更深入地知識?掌握了Netty後,如何將其套用到實際架構中?Netty工程師的就業前景和可涉足的行業是怎樣的?本書都會一一解答。

作者簡介

李林鋒:Netty中國推廣者,現華為技術有限公司平台中間件架構與設計部設計師,公司總裁技術創新獎獲得者。長期從事高性能通信軟體的架構設計和開發工作,有多年在NIO領域的設計、開發和運維經驗,精通NIO編程和Netty、Mina等主流NIO框架。

專業推薦

媒體推薦

與林鋒兄相識甚早,他在NIO相關領域實戰經驗豐富,成績斐然,並且樂於分享,旨在幫助更多人得到技術上的進步,是一位我很尊敬的技術思考者、實踐者和推廣者。Netty作為Dubbo底層的高性能分散式通信框架,在實際開發中,我非常關心如高效序列化/編解碼、執行緒模型調優、高效Buffer使用、心跳重連策略、優雅停機、宕機異常處理、NIO並發安全處理等核心問題,而本書中對這些問題都進行了詳細說明,並提煉出了處理原則,給出了提綱挈領般的引導。書中對這些問題的分析總結可以得到不少從頭摸爬滾打才能獲得的收穫,希望你和我一樣能有眼前一亮的感覺。
——阿里巴巴Dubbo、PaaS平台核心開發架構師 李鼎
Netty是一個令人驚訝的項目,在短短几年成為眾多Java高並發異步通信的首選框架。但目前國內資料極少並缺乏系統性,而李兄的這本系統介紹Netty開發和原理的書籍,很完美地填補了這個空白。國內的技術人員對Java NIO和Netty理解多一些,也就意味著國內整體網路編程技術的進步。本書條理清晰,對技術的闡述循序漸進,是一本難得的Netty學習教材,推薦有志青年仔細學習研究本書,共同把NIO異步通信編程推向一個新高度。
——JBoss套用伺服器核心開發組成員 張建鋒
Netty的卓越之處在於它是一個高性能、異步事件驅動的NIO框架,目前很多著名的開源框架開始將底層的通信框架切換到Netty,如Hadoop、Storm等,Facebook的後台也即將啟用這一優秀框架。希望這本書的面市能夠對於Netty在國內的發展起到推動作用。
——Facebook資深工程師 覃超
經常有很多Java領域的應屆生和程式設計師來諮詢我我,說自己非常希望找到心儀的工作,但是不知道如何學習和提高。在Java中我覺得比較有挑戰性的技術就是網路I/O編程和多執行緒並發編程,而Netty作為企業高性能異步NIO通信的首選框架,在Facebook、Twitter、阿里巴巴等著名公司都得到了套用,學習和掌握它,對於個人的職業和技術發展都極具意義。本書正是一本引領我們由淺入深學習Netty的寶典,非常值得仔細研讀和思考。
——並發編程網站長 方騰飛
大數據時代的來臨使Netty的優勢得以更廣泛的發揮。在分散式集群中進行大數據計算,伴隨著海量數據在不同計算節點間的傳輸——這個工作在目前流行的Spark、Storm和Hadoop中,都是由Netty來實現的,它就好像是大數據計算的血管一般。深入大數據計算,Netty是必須掌握的技能之一。
——唯品會高級軟體開發工程師 姚仁捷
網路通信框架Netty已經逐漸成為了構建高可用分散式系統核心組件通信的基礎,它的執行緒模型、零拷貝和多協定支持也讓從業者們愛不釋手,林鋒兄作為國內NIO領域和Netty框架研究最早、水平最高的架構師之一,在本書中對Netty進行了全面的解析,其中大量的源碼剖析和實戰講解給想學習NIO編程和Netty,進階分散式的同學提出了一些思想或者說指引了前進方向,非常推薦。
——1號店資深架構師 彭榮新
Netty提供了高穩定性、高性能的網路編程接口,封裝了TCP/UDP複雜的Socket實現細節,簡單易用。本書由淺入深,適合不同層次的工程師閱讀!
——阿里巴巴網站高性能技術架構師 周濤明

名人推薦

由於傳統基於BIO的同步阻塞通信無法滿足高可靠、高性能的Java伺服器領域,從JDK1.4開始,Java提供了一套新的異步非阻塞I/O類庫:NIO。然而由於NIO編程的複雜性,很長一段時間NIO編程並沒有流行起來。Netty等NIO框架的誕生和流行,彌補了原生NIO類庫的不足,使得基於異步非阻塞模式開發的套用伺服器越來越多。例如,Facebook、Twitter、阿里巴巴等都使用Netty構建高性能的分散式服務框架。儘管Netty在業界和國內已經得到廣泛的套用,然而並沒有一本系統性的Netty教材來講解Netty的原理、架構和最佳實踐。本書由淺入深的引領讀者掌握Netty主要類庫的使用,編解碼框架的定製和開發,私有協定棧的設計和實現。在源碼分析章節對Netty的核心類庫進行原理剖析和講解。最後,通過行業套用讓大家掌握如何在不同的領域和行業套用Netty解決實際問題。

圖書目錄

基礎篇走進JavaNIO
第1章Java的I∕O演進之路2
1.1I∕O基礎入門3
1.1.1Linux網路I∕O模型簡介3
1.1.2I∕O多路復用技術6
1.2Java的I∕O演進8
1.3總結10
第2章NIO入門11
2.1傳統的BIO編程11
2.1.1BIO通信模型圖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.3NIO編程24
2.3.1NIO類庫簡介24
2.3.2NIO服務端序列圖28
2.3.3NIO創建的TimeServer源碼分析31
2.3.4NIO客戶端序列圖36
2.3.5NIO創建的TimeClient源碼分析39
2.4AIO編程45
2.4.1AIO創建的TimeServer源碼分析46
2.4.2AIO創建的TimeClient源碼分析52
2.4.3AIO版本時間伺服器運行結果56
2.54種I∕O的對比58
2.5.1概念澄清58
2.5.2不同I∕O模型對比60
2.6選擇Netty的理由60
2.6.1不選擇Java原生NIO編程的原因61
2.6.2為什麼選擇Netty62
2.7總結63
入門篇NettyNIO開發指南
第3章Netty入門套用66
3.1Netty開發環境的搭建66
3.1.1下載Netty的軟體包67
3.1.2搭建Netty套用工程67
3.2Netty服務端開發68
3.3Netty客戶端開發73
3.4運行和調試76
3.4.1服務端和客戶端的運行76
3.4.2打包和部署77
3.5總結78
第4章TCP粘包∕拆包問題的解決之道79
4.1TCP粘包∕拆包79
4.1.1TCP粘包∕拆包問題說明80
4.1.2TCP粘包∕拆包發生的原因80
4.1.3粘包問題的解決策略81
4.2未考慮TCP粘包導致功能異常案例82
4.2.1TimeServer的改造82
4.2.2TimeClient的改造83
4.2.3運行結果84
4.3利用LineBasedFrameDecoder解決TCP粘包問題88
4.3.1支持TCP粘包的TimeServer88
4.3.2支持TCP粘包的TimeClient90
4.3.3運行支持TCP粘包的時間伺服器程式93
4.3.4LineBasedFrameDecoder和StringDecoder的原理分析98
4.4總結99
第5章分隔設定和定長解碼器的套用100
5.1DelimiterBasedFrameDecoder套用開發101
5.1.1DelimiterBasedFrameDecoder服務端開發101
5.1.2DelimiterBasedFrameDecoder客戶端開發104
5.1.3運行DelimiterBasedFrameDecoder服務端和客戶端106
5.2FixedLengthFrameDecoder套用開發108
5.2.1FixedLengthFrameDecoder服務端開發108
5.2.2利用telnet命令行測試EchoServer服務端110
5.3總結111
中級篇Netty編解碼開發指南
第6章編解碼技術114
6.1Java序列化的缺點115
6.1.1無法跨語言115
6.1.2序列化後的碼流太大115
6.1.3序列化性能太低118
6.2業界主流的編解碼框架121
6.2.1Google的Protobuf介紹121
6.2.2Facebook的Thrift介紹123
6.2.3JBossMarshalling介紹124
6.3總結125
第7章Java序列化126
7.1NettyJava序列化服務端開發126
7.2Java序列化Netty客戶端開發132
7.3運行結果135
7.4總結137
第8章GoogleProtobuf編解碼138
8.1Protobuf的入門139
8.1.1Protobuf開發環境搭建139
8.1.2Protobuf編解碼開發141
8.1.3運行Protobuf例程143
8.2Netty的Protobuf服務端開發143
8.2.1Protobuf版本的圖書訂購服務端開發144
8.2.2Protobuf版本的圖書訂購客戶端開發146
8.2.3Protobuf版本的圖書訂購程式功能測試149
8.3Protobuf的使用注意事項152
8.4總結153
第9章JBossMarshalling編解碼154
9.1Marshalling開發環境準備154
9.2Netty的Marshalling服務端開發155
9.3Netty的Marshalling客戶端開發158
9.4運行Marshalling客戶端和服務端例程160
9.5總結162
高級篇Netty多協定開發和套用
第10章HTTP協定開發套用164
10.1HTTP協定介紹165
10.1.1HTTP協定的URL165
10.1.2HTTP請求訊息(HttpRequest)165
10.1.3HTTP回響訊息(HttpResponse)168
10.2NettyHTTP服務端入門開發169
10.2.1HTTP服務端例程場景描述170
10.2.2HTTP服務端開發170
10.2.3NettyHTTP檔案伺服器例程運行結果178
10.3NettyHTTP+XML協定棧開發182
10.3.1開發場景介紹183
10.3.2HTTP+XML協定棧設計186
10.3.3高效的XML綁定框架JiBx187
10.3.4HTTP+XML編解碼框架開發195
10.3.5HTTP+XML協定棧測試211
10.3.6小結213
10.4總結214
第11章WebSocket協定開發215
11.1HTTP協定的弊端216
11.2WebSocket入門216
11.2.1WebSocket背景217
11.2.2WebSocket連線建立218
11.2.3WebSocket生命周期219
11.2.4WebSocket連線關閉220
11.3NettyWebSocket協定開發221
11.3.1WebSocket服務端功能介紹221
11.3.2WebSocket服務端開發222
11.3.3運行WebSocket服務端230
11.4總結231
第12章UDP協定開發233
12.1UDP協定簡介234
12.2UDP服務端開發235
12.3UDP客戶端開發238
12.4運行UDP例程240
12.5總結241
第13章檔案傳輸242
13.1檔案的基礎知識243
13.1.1檔案的概念243
13.1.2檔案路徑243
13.1.3檔案名稱稱244
13.1.4FileChannel簡介244
13.2Netty檔案傳輸開發245
13.3運行Netty檔案傳輸服務例程248
13.4總結250
第14章私有協定棧開發251
14.1私有協定介紹251
14.2Netty協定棧功能設計253
14.2.1網路拓撲圖253
14.2.2協定棧功能描述254
14.2.3通信模型254
14.2.4訊息定義255
14.2.5Netty協定支持的欄位類型256
14.2.6Netty協定的編解碼規範257
14.2.7鏈路的建立259
14.2.8鏈路的關閉260
14.2.9可靠性設計260
14.2.10安全性設計262
14.2.11可擴展性設計262
14.3Netty協定棧開發263
14.3.1數據結構定義263
14.3.2訊息編解碼267
14.3.3握手和安全認證271
14.3.4心跳檢測機制275
14.3.5斷連重連278
14.3.6客戶端代碼279
14.3.7服務端代碼281
14.4運行協定棧282
14.4.1正常場景282
14.4.2異常場景:服務端宕機重啟283
14.4.3異常場景:客戶端宕機重啟286
14.5總結286
……
源碼分析篇Netty功能介紹和源碼分析
架構和行業套用篇Netty高級特性
附錄ANetty參數配置表

文摘

10.3.4 HTTP+XML編解碼框架開發
本節共有6個小節來講解如何基於Netty開發HTTP+XML協定棧,在Netty提供的HTTP基礎協定棧上進行擴展和封裝,以實現對上層業務的零侵入。下面我們一起學習如何進行開發。
1.HTTP+XML請求訊息編碼類
對於上層業務側,構造訂購請求訊息後,以HTTP+XML協定將訊息傳送給服務端,如果要實現對業務零侵入或者儘可能少的侵入,協定層和套用層應該解耦。
考慮到HTTP+XML協定棧需要一定的定製擴展能力,例如通過HTTP訊息頭攜帶業務自定義欄位,所以,應該允許業務利用Netty的HTTP協定棧接口自行構造私有的HTTP訊息頭。
HTTP+XML的協定編碼仍然採用ChannelPipeline中增加對應的編碼handler類實現。
下面我們來一起看下HTTP+XML請求訊息編碼類的源碼實現。
代碼清單10-8 HTTP+XML HTTP請求訊息編碼類
11. public class HttpXmlRequestEncoder extends
12. AbstractHttpXmlEncoder {
13.
14. @Override
15. protected void encode(ChannelHandlerContext ctx, HttpXmlRequest msg,
16. List

序言

大約在2008年的時候,我參與設計和開發的一個電信系統在月初出帳期,總是發生大量的連線逾時和讀寫逾時異常,業務的失敗率相比於平時高了很多,報表中的很多指標都差強人意。後來經過排查,發現問題的主要原因出現在下游網元的處理性能上,月初的時候BSS出帳,在出帳期間BSS系統運行緩慢,由於雙方採用了同步阻塞式的HTTP+XML進行通信,導致任何一方處理緩慢都會影響對方的處理性能。按照故障隔離的設計原則,對方處理速度慢或者不回應答,不應該影響系統的其他功能模組或者協定棧,但是在同步阻塞I/O通信模型下,這種故障傳播和相互影響是不可避免的,很難通過業務層面解決。
受限於當時Tomcat和Servlet的同步阻塞I/O模型,以及在Java領域異步HTTP協定棧的技術積累不足,當時我們並沒有辦法完全解決這個問題,只能通過調整執行緒池策略和HTTP逾時時間來從業務層面做規避。
2009年,由於對技術的熱愛,我作為業務骨幹被領導派去參加一個重點業務平台的研發工作,與兩位資深的架構師(其中一位工作20年,做華為交換機出身)共同參與。這是我第一次全面接觸異步I/O編程和高性能電信級協定棧的開發,眼界大開——異步高性能內部協定棧、異步HTTP、異步SOAP、異步SMPP……所有的協定棧都是異步非阻塞。後來的性能測試表明:基於Reactor模型統一調度的長連線和短連線協定棧,無論是性能、可靠性還是可維護性,都可以“秒殺”傳統基於BIO開發的套用伺服器和各種協定棧,這種差異本質上是一種代差。
在我從事異步NIO編程的2009年,業界還沒有成熟的NIO框架,那個時候Mina剛剛開始起步,功能和性能都達不到商用標準。最困難的是,國內Java領域的異步通信還沒有流行,整個業界的積累都非常少。那個時候資料匱乏,能夠交流和探討的圈內人很少,一旦踩住“地雷”,就需要夜以繼日地維護。在隨後2年多的時間裡,經歷了10多次的在通宵、凌晨被一線的運維人員電話吵醒等種種磨難之後,我們自研的NIO框架才逐漸穩定和成熟。期間,解決的BUG總計20~30個。
從2004年JDK1.4首次提供NIO 1.0類庫到現在,已經過去了整整10年。JSR 51的設計初衷就是讓Java能夠提供非阻塞、具有彈性伸縮能力的異步I/O類庫,從而結束Java在高性能伺服器領域的不利地位。然而,在相當長的一段時間裡,Java的NIO編程並沒有流行起來,究其原因如下。
1. 大多數高性能伺服器,被C和C++語言盤踞,由於它們可以直接使用作業系統的異步I/O能力,所以對JDK的NIO並不關心;
2. 移動網際網路尚未興起,基於Java的大規模分散式系統極少,很多中小型套用服務對於異步I/O的訴求不是很強烈;
3. 高性能、高可靠性領域,例如銀行、證券、電信等依然以C++為主導,Java充當打雜的角色,NIO暫時沒有用武之地;
4. 當時主流的J2EE伺服器,幾乎全部基於同步阻塞I/O構建,例如Servlet、Tomcat等,由於它們套用廣泛,如果這些容器不支持NIO,用戶很難具備獨立構建異步協定棧的能力;
5. 異步NIO編程門檻比較高,開發和維護一款基於NIO的協定棧對很多中小型公司來說像是一場噩夢;
6. 業界NIO框架不成熟,很難商用;
7. 國內研發界對NIO的陌生和認識不足,沒有充分重視。
基於上述幾種原因,NIO編程的推廣和發展長期滯後。值得欣慰的是,隨著大規模分散式系統、大數據和流式計算框架的興起,基於Java來構建這些系統已經成為主流,NIO編程和NIO框架在此期間得到了大規模的商用。在網際網路領域,阿里的分散式服務框架Dubbo、RocketMQ,大數據的基礎序列化和通信框架Avro,以及很多開源的軟體都已經開始使用Netty來構建高性能、分散式通信能力,Netty社區的活躍度也名列前茅。根據目前的信息,Netty已經在如下幾個領域得到了大規模的商業套用。
1. 網際網路領域;
2. 電信領域;
3. 大數據領域;
4. 銀行、證券等金融領域;
5. 遊戲行業;
6. 電力等企業市場。
2014年春節前,我分享了一篇博文《Netty5.0架構剖析和源碼解讀》,短短1個月下載量達到了4000多。很多網友向我諮詢NIO編程技術、NIO框架如何選擇等問題,也有一些圈內朋友和出版社邀請我寫一本關於Netty的技術書籍。作為最流行、表現最優異的NIO框架Netty深受大家喜愛,但是長期以來除了UserGuide之外,國內鮮有Netty相關的技術書籍供廣大NIO編程愛好者學習和參考。由於Netty源碼的複雜性和NIO編程本身的技術門檻限制,對於大多數讀者而言,通過自己閱讀和分析源碼來深入掌握Netty的設計原理和實現細節是件困難的事情。從2011年開始我系統性的分析和套用了Netty和Mina,轉瞬間已經過去了3年多。在這3年的時間裡,我們的系統經受了無數嚴苛的考驗,在這個過程中,對Netty和Mina有了更深刻的體驗,也積累了豐富的運維和實戰經驗。我們都是開源框架Netty的受益者,為了讓更多的朋友和同行能夠了解NIO編程,深入學習和掌握Netty這個NIO利器,我打算將我的經驗和大家分享,同時也結束國內尚無Netty學習教材的尷尬境地。
內容介紹
本書涵蓋了Netty NIO框架的絕大部分知識點,包括Java I/O的演進歷史、傳統BIO通信的弊端、Java 4種I/O通信模型的優缺點對比。以及Netty入門、Netty編解碼框架、檔案傳輸、多協定和私有協定棧定製和開發。在源碼分析章節,詳細介紹了ByteBuf、Channel和Unsafe、ChannelPipeline和ChannelHandler、NioEventLoop、ChannelFuture和ChannelPromise的設計原理和源碼分析。在高級套用章節,介紹了Netty的邏輯架構模型、Netty的執行緒模型和行業套用。最後附錄了Netty啟動配置參數項說明。
聯繫方式
儘管我也有技術潔癖,希望諸事完美,但是由於Netty代碼的龐雜和涉及到的知識點太多,一本書籍很難涵蓋所有的功能點。如有遺漏或者錯誤,懇請大家能夠及時批評和指正,如果你有好的建議或者想法,也可以聯繫我。我的聯繫方式如下:信箱: [email protected] 新浪微博: Nettying微信:Nettying。
致謝
如果說個人能夠改變自己命運的話,對於程式設計師來說,唯有通過不斷的學習和實踐,努力提升自己的技能,才有可能找到更好的機會,充分發揮和體現自己的價值。我希望本書能夠為你的成功助一臂之力。
感謝博文視點的策劃編輯丁一瓊和幕後的美編,正是你們的辛苦工作才保證了本書能夠順利出版;感謝華為Netty愛好者和關注本書的領導同事們的支持,你們的理解和鼓勵為我提供了足夠的勇氣。感謝我的家人和老婆的支持,寫書占用了我幾乎所有的業餘時間,沒有你們的理解和支持,我很難安心寫作。
最後感謝Netty中國社區的朋友,我的微博冬粉和所有喜歡Netty的朋友們,你們對技術的熱情是鼓勵我寫書的最重要動力,沒有你們,就沒有本書。希望大家一如既往的喜歡NIO編程,喜歡Netty,以及相互交流和分享,共同推動整個國內異步高性能通信領域的技術發展。
李林鋒 5月11日於南京紫軒閣

相關詞條

相關搜尋

熱門詞條

聯絡我們