1、Hadoop、Storm、Spark、Facebook、Twitter、阿裏巴巴都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過本書你可以全麵、係統地理解Netty 架構設計理念,以及異步NIO 編程。
2、本書作者為資深一綫專傢,在産品中廣泛應用瞭Netty等NIO框架,具有豐富的多年實踐經驗,這就使得本書內容帶有很強的實踐性,讓你更全麵快速掌握Java高並發異步通信的優選框架Netty的用法。
3、本書第一版齣版後受到業界的一緻好評,應讀者的要求,第2版增加瞭MessagePack 編解碼、服務端創建、客戶端創建、高性能之道、可靠性、安全性等內容,內容更精彩。
Netty是什麼?使用Netty能夠做什麼?為什麼要從傳統的Socket開發切換到NIO進行編程?為什麼不直接基於JDK的NIO類庫編程而選擇Netty?如何全麵係統地掌握Netty進行NettyNIO開發、Netty編解碼開發、Netty多協議開發?如何通過對Netty源碼的學習獲得更深入地知識?掌握瞭Netty後,如何將其應用到實際架構中?Netty工程師的就業前景和可涉足的行業是怎樣的?本書都會一一解答。
推薦購買:
《Netty quanwei指南(第2 版)》是異步非阻塞通信領域的經典之作,基於全新版本的Netty 5.0 編寫,是國內首本深入介紹Netty 原理和架構的書籍,也是作者多年實戰經驗的總結和濃縮。內容不僅包含Java NIO入門知識、Netty 的基礎功能開發指導、編解碼框架定製等,還包括私有協議棧定製和開發、Netty 核心類庫源碼分析,以及Netty 的架構剖析。
李林峰,Netty中國推廣者,現華為技術有限公司平颱中間件架構與設計部設計師,公司總裁技術創新奬獲得者。長期從事高性能通信軟件的架構設計和開發工作,有多年在NIO領域的設計、開發和運維經驗,精通NIO編程和Netty、Mina等主流NIO框架。
★林鋒讓我給這本新書寫個推薦,不勝榮幸。我和林鋒接觸時間不長,已經感受到瞭他對技術的熱愛和不盡探索。這種熱愛完全來自於內心的驅動,不摻雜任何雜質,我認為他是我見到的為數不多的技術熱愛者。也正是因為這種熱愛,促使林鋒花費瞭很多業餘時間,完成瞭這樣一本對Netty的專業編程指南。相信讀者在閱讀此書時,在感嘆內容之豐富詳實的同時,也會深深感受到林鋒對所著技術的熱愛。我想這就是我們通過書中文字相遇的初衷吧。當我們的技術能夠日益精進,達到專業的水準,生産力會成倍甚至指數級地增長。希望讀者能夠通過閱讀此書獲取這種精進的力量。
——IBM中國開發實驗室開發總監 黃省江
★Netty的優秀之處在於它是一個高性能、異步事件驅動的NIO框架,目前很多知名的開源框架開始將底層的通信框架切換到Netty,如Hadoop、Storm等,Facebook的後颱也即將啓用這一優秀框架。希望這本書的麵市能夠對Netty在國內的發展起到推動作用。
——Facebook資深工程師 覃超
★中國很大的閱讀類應用——中國移動手機閱讀基地,每天承受著5~7.5億PV的訪問量,為瞭實現業務的彈性,華為Digital SDP産品承接瞭對其後颱進行微服務重構的工作,一個PV背後的後颱原子接口訪問達到幾十乃至上百次,還要保證90%的頁麵訪問在500ms內響應,在這樣的壓力下,高效的通信機製尤其重要,林鋒基於Netty構建的對等通信虛擬總綫很好地承載瞭這一需求。平均通信時延0.71ms,80%以上的通信時延都保持在1ms以下,其餘通信時延都低於3ms,在響應速度這一重要指標上不僅滿足瞭客戶的要求,而且還帶來瞭係統可伸縮性和彈性上的巨大提升,林鋒在本書中闡釋的Netty應用上的經驗和技巧絕對值得期待。
——華為Digital SDP首席架構師 王慷
★設計開發基於異步編程模型的高性能服務器,除瞭理解和熟練應用NIO等這些Java層麵的基礎知識之外,能夠駕馭優秀的異步通信框架也是非常重要的,Netty無疑是Java領域值得學習和研究的異步事件驅動的NIO框架。作者有著多年的NIO開發和運維經驗,本書濃縮瞭作者多年實戰經驗,推薦給對Netty技術感興趣、想研究的攻城獅閱讀!
——螞蟻金服基礎技術部JVM Architect 李三紅
★Netty是一個令人驚訝的項目,在短短幾年內成為眾多Java高並發異步通信的優選框架。但目前國內資料極少並缺乏係統性,而李兄的這本係統介紹Netty開發和原理的書籍,很完美地填補瞭這個空白。國內的技術人員對Java NIO和Netty的理解多一些,也就意味著國內整體網絡編程技術的進步。本書條理清晰,對技術的闡述循序漸進,是一本難得的Netty學習教材,推薦有誌青年仔細學習研究本書,共同把NIO異步通信編程推嚮一個新高度。
——JBoss應用服務器核心開發組成員 張建鋒
13.2.1Netty服務端創建時序圖
下麵我們對Netty服務端創建的關鍵步驟和原理進行講解。
步驟1:創建ServerBootstrap實例。ServerBootstrap是Netty服務端的啓動輔助類,它提供瞭一係列的方法用於設置服務端啓動相關的參數。底層通過門麵模式對各種能力進行抽象和封裝,盡量不需要用戶跟過多的底層API打交道,降低用戶的開發難度。
我們在創建ServerBootstrap實例時,會驚訝地發現ServerBootstrap隻有一個無參的構造函數,作為啓動輔助類這讓人不可思議,因為它需要與多個其他組件或者類交互。ServerBootstrap構造函數沒有參數的根本原因是因為它的參數太多瞭,而且未來也可能會發生變化,為瞭解決這個問題,就需要引入Builder模式。《Effective Java》第二版第2條建議遇到多個構造器參數時要考慮用構建器,關於多個參數構造函數的缺點和使用構建器的優點大傢可以查閱《Effective Java》,在此不再詳述。
步驟2:設置並綁定Reactor綫程池。Netty的Reactor綫程池是EventLoopGroup,它實際就是EventLoop的數組。EventLoop的職責是處理所有注冊到本綫程多路復用器Selector上的Channel,Selector的輪詢操作由綁定的EventLoop綫程run方法驅動,在一個循環體內循環執行。值得說明的是,EventLoop的職責不僅僅是處理網絡I/O事件,用戶自定義的Task和定時任務Task也統一由EventLoop負責處理,這樣綫程模型就實現瞭統一。從調度層麵看,也不存在在EventLoop綫程中再啓動其他類型的綫程用於異步執行另外的任務,這樣就避免瞭多綫程並發操作和鎖競爭,提升瞭I/O綫程的處理和調度性能。
步驟3:設置並綁定服務端Channel。作為NIO服務端,需要創建ServerSocketChannel,Netty對原生的NIO類庫進行瞭封裝,對應實現是NioServerSocketChannel。對於用戶而言,不需要關心服務端Channel的底層實現細節和工作原理,隻需要指定具體使用哪種服務端Channel即可。因此,Netty的ServerBootstrap方法提供瞭channel方法用於指定服務端Channel的類型。Netty通過工廠類,利用反射創建NioServerSocketChannel對象。由於服務端監聽端口往往隻需要在係統啓動時纔會調用,因此反射對性能的影響並不大。相關代碼如下。
public ServerBootstrap channel(Class channelClass) {
if (channelClass == null) {
throw new NullPointerException("channelClass");
}
return channelFactory(new ServerBootstrapChannelFactory(channelClass));
}
步驟4:鏈路建立的時候創建並初始化ChannelPipeline。ChannelPipeline並不是NIO服務端必需的,它本質就是一個負責處理網絡事件的職責鏈,負責管理和執行ChannelHandler。網絡事件以事件流的形式在ChannelPipeline中流轉,由ChannelPipeline根據ChannelHandler的執行策略調度ChannelHandler的執行。典型的網絡事件如下。
(1)鏈路注冊;
(2)鏈路激活;
(3)鏈路斷開;
(4)接收到請求消息;
(5)請求消息接收並處理完畢;
(6)發送應答消息;
(7)鏈路發生異常;
(8)發生用戶自定義事件。
步驟5:初始化ChannelPipeline完成之後,添加並設置ChannelHandler。ChannelHandler是Netty提供給用戶定製和擴展的關鍵接口。利用ChannelHandler用戶可以完成大多數的功能定製,例如消息編解碼、心跳、安全認證、TSL/SSL認證、流量控製和流量整形等。Netty同時也提供瞭大量的係統ChannelHandler供用戶使用,比較實用的係統ChannelHandler總結如下。
(1)係統編解碼框架——ByteToMessageCodec;
(2)通用基於長度的半包解碼器——LengthFieldBasedFrameDecoder;
(3)碼流日誌打印Handler——LoggingHandler;
(4)SSL安全認證Handler——SslHandler;
(5)鏈路空閑檢測Handler——IdleStateHandler;
(6)流量整形Handler——ChannelTrafficShapingHandler;
(7)Base64編解碼——Base64Decoder和Base64Encoder。
創建和添加ChannelHandler的代碼示例如下。
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch)
throws Exception {
ch.pipeline().addLast(
new EchoServerHandler());
}
});
步驟6:綁定並啓動監聽端口。在綁定監聽端口之前係統會做一係列的初始化和檢測工作,完成之後,會啓動監聽端口,並將ServerSocketChannel注冊到Selector上監聽客戶端連接,相關代碼如下。
protected void doBind(SocketAddress localAddress) throws Exception {
javaChannel().socket().bind(localAddress, config.getBacklog());
}
步驟7:Selector輪詢。由Reactor綫程NioEventLoop負責調度和執行Selector輪詢操作,選擇準備就緒的Channel集閤,相關代碼如下。
private void select() throws IOException {
Selector selector = this.selector;
try {
//此處代碼省略......
int selectedKeys = selector.select(timeoutMillis);
selectCnt ++;
//此處代碼省略......
}
步驟8:當輪詢到準備就緒的Channel之後,就由Reactor綫程NioEventLoop執行ChannelPipeline的相應方法,最終調度並執行ChannelHandler,接口如圖13-2所示。
步驟9:執行Netty係統ChannelHandler和用戶添加定製的ChannelHandler。ChannelPipeline根據網絡事件的類型,調度並執行ChannelHandler,相關代碼如下。
public ChannelHandlerContext fireChannelRead(Object msg) {
DefaultChannelHandlerContext next = findContextInbound(MASK_CHANNEL_READ);
next.invoker.invokeChannelRead(next, msg);
return this;
……
2014 年6 月《Netty 權威指南》第1 版麵世之後,很多讀者通過郵件等方式嚮我錶達瞭對本書的喜愛和贊譽。同時,對本書的一些瑕疵和不足也進行瞭指正,並給齣瞭閤理的建議。我對讀者反饋的閤理建議進行瞭記錄和總結,以期在未來修訂版或者第2 版中能夠修正這些問題。
大約在2014 年11 月份的時候,編輯與我協商齣版《Netty 權威指南(第2 版)》的事宜,考慮到如下幾個因素,最終我決定推齣第2 版:
◎ 第一版需要修正少部分印刷不太清晰的圖片,這會改變後續章節的頁碼;
◎ 源碼分析章節的代碼希望重新編排一下,與前麵的開發示例保持一緻;
◎ 部分章節和內容需要優化調整;
◎ 部分讀者對推齣第2 版的要求。
第2 版的主要變更如下,刪除第1 版中的如下章節:
◎ 第7 章:Java 序列化;
◎ 第12 章:UDP 協議開發;
◎ 第13 章:文件傳輸;
◎ 第22 章:Netty 行業應用。
新增本書中的如下章節:
◎ 第7 章:MessagePack 編解碼;
◎ 第13 章:服務端創建;
◎ 第14 章:客戶端創建;
◎ 第22 章:高性能之道;
◎ 第23 章:可靠性;
◎ 第24 章:安全性。
第1 版最初的想法是盡量照顧NIO 編程和Netty 初學者,因此入門和基礎功能使用示例占瞭很大比例,涵蓋的範圍也很廣。但事實上,由於Netty 的功能過於龐雜,一本書很難涵蓋Netty 的所有功能點,因此,刪除瞭不太常用的Java 序列化、UDP 協議開發和文件傳輸。
Netty 行業應用的內容很多讀者都很期望,希望能夠展開詳細講解一下。我思索再三,忍痛割愛,不僅沒有加強本章節,反而刪除瞭它。為什麼呢?對於真正想瞭解行業應用的讀者,需要展開詳細講解纔能夠講透,剖開Netty 在Spark、Hadoop 等大數據領域的應用不談,即便是作為分布式服務框架的內部高性能通信組件,例如Dubbo,沒有大篇幅也很難講透,與其一筆概括,泛泛而談,還不如留給其他作者或者未來抽空單獨梳理。
掌握Netty 的基礎功能使用比較容易,但是理解Netty 底層的架構以及主要架構特性的設計理念卻是件睏難的事情,它需要長期的行業積纍以及對Netty 底層源碼的透徹理解。應廣大讀者的要求,在第2 版中新增瞭Netty 的高性能、安全性和可靠性的架構剖析,通過這些章節的學習,讀者可以更加清晰地理解Netty 架構設計理念。
盡管我本人已經有7 年的NIO 編程和實戰經驗,在産品中也廣泛應用瞭Netty 和Mina等NIO 框架。但是,受限於個人能力和水平,本書一定還有紕漏和不妥之處,希望廣大讀者能夠批評指正。讀者在閱讀本書或者實際工作中如果有Netty 相關的疑問,也可以直接聯係我,我會盡量迴復。我的聯係方式如下:
◎ 郵箱:neu_lilinfeng@sina.com
◎ 新浪微博:Nettying
◎ 微信:Nettying。
《Netty 權威指南》第1 版齣版之後,很多讀者來信谘詢自己實際工作和學習中遇到的Netty 問題和案例,有些案例和問題頗具典型性。我將這些案例進行瞭總結,在微信公眾號“Netty 之傢”中定期推送,希望廣大讀者可以關注。
感謝博文視點的小編丁一瓊MM 和幕後的美工,正是你們的辛苦工作纔保證瞭本書能夠順利齣版;感謝華為IT PaaS 望嶽、莫小君和Digital SDP 集成開發部徐皓等領導對我的信任和支持;感謝我的老婆在我編輯第2 版期間赦免瞭我做飯和刷碗的義務,我得以抽齣時間安心寫作。
最後感謝《Netty 權威指南》第1 版的讀者,你們的理解、鼓勵和支持,使我有足夠的勇氣和動力繼續前行。希望大傢攜起手來共同推動NIO 編程和Netty 在國內的應用和發展。
李林鋒
2015 年1 月27 日於南京
第1版前言
大約在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 年多的時間裏,經曆瞭十多次的在通宵、淩晨被一綫的運維人員電話吵醒等種種磨難之後,我們自研的NIO 框架纔逐漸穩定和成熟。期間,解決的BUG 總計20~30 個。
從2004 年JDK 1.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 年春節前,我分享瞭一篇博文《Netty 5.0 架構剖析和源碼解讀》,短短1 個月下
載量達到瞭4000 多。很多網友嚮我谘詢NIO 編程技術、NIO 框架如何選擇等問題,也有一些圈內朋友和齣版社邀請我寫一本關於Netty 的技術書籍。作為最流行、錶現最優異的NIO 框架,Netty 深受大傢喜愛,但是長期以來除瞭User Guide 之外,國內鮮有Netty 相關的技術書籍供廣大NIO 編程愛好者學習和參考。由於Netty 源碼的復雜性和NIO 編程本身的技術門檻限製,對於大多數讀者而言,通過自己閱讀和分析源碼來深入掌握Netty 的設計原理和實現細節是件睏難的事情。從2011 年開始我係統性地分析和應用瞭Netty 和Mina,轉瞬間已經過去瞭3 年多。在這3 年的時間裏,我們的係統經受瞭無數嚴苛的考驗,在這個過程中,我對Netty 和Mina 有瞭更深刻的體驗,也積纍瞭豐富的運維和實戰經驗。我們都是開源框架Netty 的受益者,為瞭讓更多的朋友和同行能夠瞭解NIO 編程,深入學習和掌握Netty 這個NIO 利器,我打算將我的經驗和大傢分享,同時也結束國內尚無Netty學習教材的尷尬境地。
緻謝
如果說個人能夠改變自己命運的話,對於程序員來說,唯有通過不斷地學習和實踐,努力提升自己的技能,纔有可能找到更好的機會,充分發揮和體現自己的價值。我希望本書能夠為你的成功助一臂之力。
感謝博文視點的策劃編輯丁一瓊和幕後的美編,正是你們的辛苦工作纔保證瞭本書能夠順利齣版;感謝華為Netty 愛好者和關注本書的領導同事們的支持,你們的理解和鼓勵為我提供瞭足夠的勇氣;感謝我的傢人和老婆的支持,寫書占用瞭我幾乎所有的業餘時間,沒有你們的理解和支持,我很難安心寫作。
最後感謝Netty 中國社區的朋友,我的微博粉絲和所有喜歡Netty 的朋友們,你們對技術的熱情是鼓勵我寫書的最重要動力,沒有你們,就沒有本書。希望大傢一如既往地喜歡NIO 編程,喜歡Netty,以及相互交流和分享,共同推動整個國內異步高性能通信領域的技術發展。
李林鋒
2014 年5 月11 日於南京紫軒閣
东西很不错,送货速度也快。
评分程序员升级必备!! 多看多练习。。。
评分挺好的,送货速度快,感谢京东!
评分好,特别好,非常不错,其他小伙伴儿需要的可以入手,
评分这次做活动买了600多的书!书的内容不可能这么快看完,都是在网上看的推荐的!建立大家有活动再买,不然太贵了!
评分老公买的,天天在看书...希望老公加油,宝宝宝宝宝宝宝宝呗呗
评分好好赞就是好赞好喜欢这个
评分好书啊好书,领导制定让买的,应该错不了。
评分哇哈哈,哇哈哈,哇哈哈,哇哈哈,哇哈哈,哇哈哈,哇哈哈
本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有