閱讀136 返回首頁    go 魔獸


《Netty實戰》Netty In Action中文版——文前內容

《Netty實戰》樣章由人民郵電出版社授權並發編程網發布,本書的中文版已經由人民郵電出版社引進並出版。

京東預售鏈接(優先發貨):《Netty實戰》([美]諾曼·毛瑞爾(Norman Maurer),馬文·艾倫·沃爾夫泰爾(Marvin Allen Wolfthal))

 

內容提要

本書是為想要或者正在使用Java從事高性能網絡編程的人而寫的,循序漸進地介紹了Netty各個方麵的內容。

本書共分為4個部分:第一部分詳細地介紹Netty的相關概念以及核心組件,第二部分介紹自定義協議經常用到的編解碼器,第三部分介紹Netty對於應用層高級協議的支持,會覆蓋常見的協議及其在實踐中的應用,第四部分是幾個案例研究。此外,附錄部分還會簡單地介紹Maven,以及如何通過使用Maven編譯和運行本書中的示例。

閱讀本書不需要讀者精通Java網絡和並發編程。如果想要更加深入地理解本書背後的理念以及Netty源碼本身,可以係統地學習一下Java網絡編程、NIO、並發和異步編程以及相關的設計模式。

中文版序

現代互聯網架構,分布式係統是一個繞不開的話題。一款優秀的網絡通信框架將在分布式係統的構建中起到舉足輕重的作用。其中,特別出名的有SUN公司的Grizzly框架、JBoss的XIO、Apache的MINA以及赫赫有名也是使用最廣泛的Netty框架。

需要指出的是,網絡通信框架的優秀不僅僅體現在性能和效率上,更重要的體現是,是否能夠屏蔽底層複雜度,編程模型是否簡單易懂,是否適用更多的應用場景,以及開發社區是否活躍。Netty的成功正是很好地滿足了上述的這幾點。作為互聯網從業人員,熟悉基於Netty網絡編程乃至深入理解Netty的設計和實現,對於無論是自研係統,還是學習開源產品,都有很大的幫助。

網絡上介紹、分析Netty的中文文章不少,其中能夠做到成體係介紹,深入淺出,原理應用並重的寥寥。Manning出版社的《Netty in Action》是一本出色的Netty教程。通過對這本書的學習,讀者可以快速掌握基於Netty的編程,以及框架背後的設計哲學。可惜一直沒有國內出版社引進出版中文版,像我這樣的英文苦手,隻能硬著頭皮去啃英文版本,不僅學得慢,有些章節還不能很好地領會作者的意圖。

很高興地得知這本經典著作要在國內出版中文版,並且是由對Netty研究很深的工程師——何品——翻譯的。我和何品打過幾次交道,深入探討過分布式架構以及網絡通信框架方麵的話題,受益良多。同時,也很驚訝於何品對技術的癡迷,以及他的技術深度和廣度。誠摯地邀請他加入我們團隊未果,甚為遺憾。十分期待這本書能很快出版發行,相信本書中文版的出版對投身互聯網係統開發的工程師快速掌握Netty會有很大的幫助。

羅毅

阿裏巴巴中間件技術部高級技術專家

 

譯者序

我對於Netty的接觸始於2012年的工作,那時需要處理一些自定義協議相關的內容,對於技術的熱情激發了我對於Netty源代碼的學習,並促使我後續更加係統地學習了很多相關的知識。但是苦於缺乏相關中文資料以及係統性的指導,使得我在最終能夠看懂Netty源代碼並且為Netty項目做出貢獻之前,花費了大量的時間,走了很多的彎路,這樣的彎路自然也是充滿苦楚和寂落的。

在後來又接觸到了Play和Akka,並且在得知了這些高性能網絡編程和並發框架的底層正是基於Netty的時候,更是讓我肯定了自己過去的投入,Netty FTW!那時,正值Netty 4重寫,從源頭改善了很多問題,提供了更好的並發模型,進一步降低了GC消耗。在跟進Netty 4的開發過程的同時,我也不斷地豐富自己的知識和經驗,並開啟了我後續職業生涯的大門。再後來,當我得知Norman正在編寫一本關於Netty的書的時候,非常激動,最終得以讀到本書的MEAP版本,並能夠有幸參與這本書的翻譯工作。

這本書循序漸進、係統性地講解了Netty的各個組件,以及其背後的設計哲學,並且對於想要深入理解Netty源代碼的讀者給出了相應的指導。難能可貴的是,這本書還附帶了5個由行業一線公司撰寫的Netty在實踐中的案例研究,並貼心地準備了一個Maven相關的介紹。

本書的翻譯經曆了兩個夏天和兩個冬天(MEAP版開始同步翻譯)。為了能給大家呈現一個盡可能完善的中文版譯本,我盡可能地使用了最新的原版書稿,並就書中的內容和原作者進行了積極的溝通。但是礙於個人水平有限,一些紕漏還請大家通過https://github.com/ReactivePlatform/ netty-in-action-cn和我取得聯係,也歡迎大家與我討論書中代碼清單相關的問題。

最後,我要感謝本書的編輯的耐心和悉心指導,感謝幫我牽線的InfoQ的臧秀濤,以及幫我審讀了這本書的朋友們。當然,還要感謝我的家人,在他們的支持和理解下,這本書才得以完成,並呈現在大家的麵前。

譯者簡介

何品 目前是淘寶的一名資深軟件工程師,熱愛網絡、並發、異步相關的主題以及函數式編程,同時也是Netty、Akka等項目的貢獻者,活躍於Scala社區,目前也在從事GraphQL相關的開發工作。

曾經人們認為Web應用服務器將會讓我們忘記如何編寫HTTP或者RPC服務器。不幸的是,這個白日夢並沒有持續多久。我們正在處理的負載量以及功能變化的速度一直在不斷地增加,超出了傳統的三層體係結構的承受能力,我們正被迫將應用程序切分成很多塊,並分發到更大的機器集群中。

運行一個如此龐大的分布式係統引發了兩個有趣的問題:運行成本和延遲。如果我們將單個節點的性能提高30%,或者甚至超過100%,那麼我們可以節省多少台機器呢?當一個來自Web瀏覽器的查詢觸發了幾十個跨越了很多不同機器的內部遠程過程調用時,我們如何能達到最低的延遲呢?

在本書(第一本關於Netty項目的書)中,Norman Maurer(Netty的核心貢獻者之一)通過展示如何使用Netty構建高性能、低延遲的網絡應用程序,給出了這些問題的最終答案。讀完這本書,你就能夠構建所有可能的網絡應用程序了,從輕量級的HTTP服務器到高度定製化的RPC服務器。

本書之所以能令人印象深刻,一方麵是因為它是由知曉Netty每個細節的核心貢獻者編寫的,另一方麵是因為它包含了幾家在其生產係統中使用了Netty的公司(Twitter、Facebook和Firebase等)的案例研究。我相信,通過展示這些使用它們的公司是如何能夠釋放他們基於Netty的應用程序的能力的,這些案例研究將會啟迪你。

你可能會驚奇地發現,早在2001年,Netty隻是我的個人項目,當時我是一名本科生(https://t.motd.kr/ko/archives/1930),而今天這個項目仍然還在並且還充滿了活力,感謝像Norman這樣的熱心的貢獻者們,他們花了許多個不眠之夜來致力於該項目(https://netty.io/community.html)。我希望通過鼓勵本書的讀者來貢獻項目,開啟該項目的另一個篇章,繼續“開啟網絡編程的未來”。

Trustin Lee

Netty項目創始人

前言

回首過去,我仍然不敢相信我做到了。

當我從2011年年末開始為Netty做貢獻時,我怎麼也想不到我會寫一本關於Netty的書,並且成為該框架本身的核心開發者之一。

這一切都始於我在2009年參與的Apache James項目,一個在Apache軟件基金會下開發的基於Java的郵件服務器。

像許多應用程序一樣,Apache James需要構建在一個堅實的網絡抽象之上。在考察提供網絡抽象的項目領域時,我偶然地發現了Netty,並且立即就愛上了它。在我從用戶的角度更加地熟悉了Netty之後,我便開始轉向改進它和回饋社區。

盡管我第一次貢獻的範圍有限,但是很快變得明顯的是,進行貢獻以及和社區進行相關問題的討論,尤其是和項目的創始人Trustin Lee,對於我的個人成長非常有益。這樣的經驗牢牢地吸引了我,我喜歡將我的空閑時間更多地投入到社區中。我在郵件列表上提供幫助,並且加入了IRC頻道的討論。致力於Netty開始是一種愛好,但很快就演變成了一種激情。

我對Netty的激情最終導致我在Red Hat就業。這簡直是美夢成真,因為Red Hat雇傭我來致力於我所熱愛的項目。我最終知道了Claus Ibsen在那時正(現在仍然)致力於Apache Camel。Claus和我認識到,雖然Netty擁有堅實的用戶基礎以及良好的JavaDoc,但是它缺乏一個更加高級別的文檔。Claus是《Camel in Action》(Manning,2010)的作者,他給了我為Netty寫一本類似的書的想法。關於這個想法,我考慮了幾個星期,最終接受了。這也就有了本書。

在編寫本書的過程中,我也越來越多地參與到了社區中。伴隨著超過1000次的提交[1],我最終成為了僅次於Trustin Lee的最活躍的貢獻者。我經常在世界各地的各種會議以及技術聚會上演講Netty。最終Netty開啟了另一個在蘋果公司的就業機會,我目前在雲基礎設施工程團隊(Cloud Infrastructure Engineering Team)擔任資深軟件工程師。我繼續致力於Netty,並且經常貢獻回饋社區,同時也幫助推動該項目。

Norman Maurer

蘋果公司,雲基礎設施工程

 

我在馬薩諸塞州韋斯頓的Harvard Pilgrim Health Care擔任Dell Services的顧問時,就主要側重於構建可複用的基礎設施組件。我們的目標是找到這樣一種擴展通用代碼庫的方式:它不僅對通常的軟件過程有利,而且還能將應用程序開發者從編寫既麻煩又平凡的管道代碼(plumbing code)的責任中解脫出來。

我一度發現,有兩個相關的項目都在使用一個第三方的理賠處理係統,該係統隻支持直接的TCP/IP通信。其中一個項目需要使用Java重新實現一個文檔不太詳細的構建在供應商的專有的基於分隔的格式上的遺留COBAL模塊。這個模塊最終被另一個項目取代了,那個項目將使用較新的基於XML的接口來連接到該相同理賠係統上。(但是使用的仍然是裸套接字,而不是SOAP!)

在我看來,這是一個理想的開發一個通用API的機會,而且也充滿了樂趣。我知道將會有嚴格的吞吐量和可靠性要求,並且設計也仍然在不斷地演進。顯然,為了支持快速的迭代周期,底層的網絡代碼必須完全和業務邏輯解耦。

我對於Java的高性能網絡編程框架的調研把我直接帶到了Netty麵前。(在第1章開頭讀者會讀到一個假設的項目,它其實基本上取材自現實生活。)我很快就確信了Netty的方式,使用可動態配置的編碼器和解碼器,能夠完美地滿足我們的需求:兩個項目將可以使用相同的API,並部署所使用的特定數據格式所需的處理器。在我發現該供應商的產品也是基於Netty的之後,我變得更加堅信了!

就在那時,我得知有一本我一直都在期待的叫《Netty實戰》的書正在編寫中。我讀了早期的書稿,並帶著一些問題和建議很快和Norman取得了聯係。在我們多次的交流過程中,我們常常會談到要記住最終用戶的視角,而且因為我當時正在參與一個實實在在的Netty項目,所以我很高興地擔當了這個(合著者/最終用戶)角色。

我希望,通過這種方式,我們能夠成功地滿足開發者們的需求。如果您有任何關於我們如何能夠使得本書變得更加有用的建議,請在https://forums.manning.com/forums/netty-in-action聯係我們。

Marvin Allen Wolfthal

Dell Services

致謝

Manning團隊使得編寫本書的過程很快樂,而且他們從未曾在這份快樂比所預期的要長一些時有過任何抱怨。從Mike Stephens(他使得這一切成為了可能)和Jeff Bleiel(從他那裏我們學到了一些關於協作的新知識)到Jennifer Stout、Andy Carroll和Elizabeth Martin(她展示出的冷靜和耐心令我們望塵莫及),他們所有人都具備非常的專業水平和素質,激勵著作者們也盡善盡美。

感謝那些幫助校審本書的人們,不管是通過閱讀那些早期版本的章節並在Author Online論壇張貼勘誤的,還是通過在本書編寫的各個階段校審書稿的。你們是本書的一部分,應該感到自豪。沒有你們,這本書將不可能會像現在這樣。特別地感謝下麵的這些審閱者們:Achim Friedland、Arash Bizhan Zadeh、Bruno Georges、Christian Bach、Daniel Beck、Declan Cox、Edward Ribeiro、Erik Onnen、Francis Marchi、Gregor Zurowski、Jian Jin、Jürgen Hoffmann、Maksym Prokhorenko、Nicola Grigoletti、Renato Felix和Yestin Johnson。同樣也感謝我們優秀的技術校對:David Dossot和Neil Rutherford。

我們非常感激並且由衷地感謝Bruno de Carvalho、Sara Robinson、Greg Soltis、Erik Onnen、Andrew Cox以及Jeff Smick,他們貢獻了第14章和第15章的案例研究。

最後但並非最不重要,感謝所有支持Netty以及開源項目的人們,沒有你們和社區,就不可能有這個項目。通過社區,我們得以結識新朋友、在世界各地的會議上討論,並且同時獲得了專業和個人方麵的成長。

Norman Maurer

我想要感謝我的前同事也是朋友Jürgen Hoffmann(也叫Buddy)。Jürgen幫助我找到了我進入開源世界的道路,並且向我展示了當你擁有足夠的勇氣參與時,你將能構建出多麼酷的東西。如果沒有他,我可能永遠也不會接觸到編程,也因此不會發現我真正的專業激情所在。

另外,要非常地感謝我的朋友Trustin Lee——Netty的創始人,最初是他幫助並且鼓勵了我為Netty項目做貢獻,還為我們的書作序。我很榮幸能夠認識你並能夠和你成為朋友!我相信通過繼續一起工作,Netty將繼續令人驚歎並長久存在!

我還想感謝我的合著者Marvin Wolfthal。盡管Marvin在該項目的後期才加入,但他幫助我極大地提高了整體的結構和內容。沒有他,這本書不可能有現在的樣子。這讓我想到了Manning團隊本身,他們總是能夠給予幫助和正確的指引,使得編寫一本書的想法成為現實。

感謝我的父母Peter和Christa一直以來支持我以及我的想法。

最要感謝的是我的妻子Jasmina以及我的孩子們Mia Soleil和Ben,感謝他們在我編寫這本書的過程中所給予的支持。沒有你們就不可能有這本書。

Marvin Wolfthal

首先,我要感謝我的合著者Norman Maurer,感謝他出色的工作以及他的友善。雖然我加入該項目的時間比較晚,但他依然讓我感覺好像是從第一天開始就成為了它的一部分似的。

對於我過去和現在在Dell Services以及Harvard Pilgrim Health Care的同事們,我衷心地感謝他們的幫助及鼓勵。他們創造了不可多得的環境,在那裏,不僅可以表達新的想法,而且還能將其築成現實。致Deborah Norton、Larry Rapisarda、Dave Querusio、Vijay Bhatt、Craig Bogovich以及Sharath Krishna,特別要感謝的是他們的支持,以及更難得的是他們的信任——我相信沒有多少軟件開發者能夠被給予我在過去4年裏所享受到的創造性的機會,包括將Netty引入到我們的工具集中。

但最重要的是,感謝我心愛的妻子Katherine,她讓我永遠不會忘記那些真正重要的東西。

關於本書

Netty是一款用於快速開發高性能的網絡應用程序的Java框架。它封裝了網絡編程的複雜性,使網絡編程和Web技術的最新進展能夠被比以往更廣泛的開發人員接觸到。

Netty不隻是一個接口和類的集合;它還定義了一種架構模型以及一套豐富的設計模式。但是直到現在,依然缺乏一個全麵的、係統性的用戶指南,已經成為入門Netty的一個障礙,這種情況也是本書旨在改變的。除了解釋該框架的組件以及API的詳細信息之外,本書還會展示Netty如何能夠幫助開發人員編寫更高效的、可複用的、可維護的代碼。

誰應該閱讀本書

本書假定讀者熟悉中等級別的Java主題,如泛型和多線程處理。不要求有高級網絡編程的經驗,但是熟悉基本的Java網絡編程API將大有裨益。

Netty使用Apache Maven作為它的構建管理工具。如果讀者還未使用過Maven,那麼附錄將會為讀者提供運行本書示例代碼所需要的信息。讀者也可以複用這些示例的Maven配置,作為自己的基於Netty的項目的起點。

導讀

本書共分4個部分,且有一個附錄。

第一部分:Netty的概念及體係結構

第一部分是對框架的詳細介紹,涵蓋了它的設計、組件以及編程接口。

第1章首先簡要概述了阻塞和非阻塞的網絡API,以及它們對應的JDK接口。我們引入Netty作為構建高度可伸縮的、異步的、事件驅動的網絡編程應用的工具包。我們將首先看一下該框架的基礎構件塊:Channel、回調、Future、事件及ChannelHandler

第2章解釋了如何配置讀者的係統以構建並運行本書中的示例代碼。我們將用一個簡單的應用程序來測試它,這是一個回送從連接的客戶端接收到的消息的服務器應用程序。我們還介紹了引導(Bootstrap)——在運行時組裝和配置一個應用程序的所有組件的過程。

第3章首先討論了Netty的技術以及體係結構方麵的內容。介紹了該框架的核心組件:ChannelEventLoopChannelHandler以及ChannelPipeline。這一章的最後解釋了引導服務器和客戶端之間的差異。

第4章討論了網絡傳輸,並且對比了通過JDK API和Netty使用阻塞和非阻塞傳輸的用法。我們研究了Netty的傳輸API的底層接口的層級關係以及它們所支持的傳輸類型。

第5章專門介紹了該框架的數據處理API——ByteBuf,Netty的字節容器。我們描述了它相對於JDK的ByteBuffer的優勢,以及如何分配和訪問由ByteBuf所使用的內存。我們展示了如何通過引用計數來管理內存資源。

第6章重點介紹了核心組件ChannelHandlerChannelPipeline,它們負責調度應用程序的處理邏輯,並驅動數據和事件經過網絡層。其他的主題包括在實現高級用例時ChannelHandlerContext的角色, 以及在多個ChannelPipeline之間共享ChannelHandler的緣由。這一章的最後說明了如何處理由入站事件和出站事件所觸發的異常。

第7章提供了關於線程模型的一般概述,並詳細地介紹了Netty的線程模型。我們研究了interface EventLoop,它是Netty的並發API的主要部分,並解釋了它和線程以及Channel的關係。這個信息對於理解Netty是如何實現異步的、事件驅動的網絡編程模型來說至關重要。我們展示了如何通過EventLoop進行任務調度。

第8章以介紹Bootstrap類的層級結構作為引子,深入地講解了引導。我們重新審視了一些基本用例以及一些特殊用例,例如,在一個服務器應用程序中引導一個客戶端連接、引導數據報Channel,以及在引導的過程中添加多個ChannelHandler。這一章最後討論了如何優雅地關閉應用程序並有序地釋放所有的資源。

第9章是關於對ChannelHandler進行單元測試的討論,對此Netty提供了一個特殊的Channel實現——EmbeddedChannel。本章的示例展示了如何使用這個類和JUnit一起來測試入站和出站ChannelHandler實現。

第二部分:編解碼器

數據轉換是網絡編程中最常見的操作之一。第二部分介紹了Netty提供的用於簡化這一任務的豐富的工具集。

第10章首先解釋了解碼器和編碼器,它們將字節序列從一種格式轉換為另外一種格式。一個無處不在的例子便是將一個非結構化的字節流轉換為一個特定於協議的布局結構,或者相反的。編解碼器則是一個結合了編碼器以及解碼器以處理雙向轉換的組件。我們提供了幾個例子,展示了通過Netty的編解碼器框架類創建自定義的解碼器以及編碼器是多麼地容易。

第11章研究了Netty提供的用於各種用例的編解碼器以及ChannelHandler。這些類包括用於協議的(如SSL/TLS、HTTP/HTTPS、WebSocket以及SPDY)即用型的編解碼器,以及能夠通過擴展來處理幾乎任意的基於分隔符的協議、變長協議或者定長協議的解碼器。這一章的最後介紹了用於寫入大型數據的和用於序列化的框架組件。

第三部分:網絡協議

第三部分詳細闡述了幾種本書前麵簡要介紹過的網絡協議。我們將會再次看到Netty是如何使你能在自己的應用程序中輕鬆采用複雜的API,而又不必關心其內部複雜性的。

第12章展示了如何使用WebSocket協議來實現Web服務器和客戶端之間的雙向通信。示例程序是一個聊天室服務器,其允許所有已連接的用戶與其他已連接的用戶進行實時通信。

第13章通過利用了用戶數據報協議(UDP)的廣播能力的服務器和客戶端應用程序,說明了Netty對於無連接協議的支持。如同前麵的那些示例一樣,我們使用了一組特定於協議的支持類:DatagramPacketNioDatagramChannel

第四部分:案例研究

第四部分介紹了由使用Netty實現了任務關鍵型係統的知名公司提交的5份案例研究。這些案例不僅說明了我們在整本書中所討論過的框架各個組件在現實世界中的應用,而且還演示了Netty的設計以及架構原則,在構建高度可伸縮和可擴展的應用程序方麵的應用。

第14章有Droplr、Firebase以及Urban Airship提交的案例研究。

第15章有Facebook和Twitter提交的案例研究。

附錄:Maven介紹

該附錄的主要目的是提供一個對於Apache Maven的基本介紹,以便讀者可以編譯和運行本書的示例代碼清單,並在開始使用Netty時擴展它們來創建自己的項目。

介紹了以下主題:

  • Maven的主要目標和用途;
  • 安裝以及配置Maven;
  • Maven的基本概念——POM文件、構件、坐標、依賴、插件及存儲庫;
  • Maven配置的示例,POM的繼承以及聚合;
  • Maven的命令行語法。

代碼約定和下載

這本書提供了豐富的示例,說明了如何利用每個涵蓋的主題。為了將代碼和普通文本區分開,代碼清單或者正文中的代碼都是以等寬字體(如fixed-width font like this)顯示的。此外,正文中的類和方法名、對象屬性以及其他代碼相關的術語和內容也都以等寬字體呈現。

偶爾,代碼是斜體的,如reference.dump()。在這種情況下,不要逐字輸入reference,要把它替換為所需的內容。

本書的源代碼可以從出版商的網站www.manning.com/books/netty-in-action以及GitHub的項目地址 https://github.com/normanmaurer/netty-in-action獲取[1]。我們將源代碼構造成了一個多模塊的Maven項目,其中包含一個頂級POM和多個對應於本書各章的模塊。

關於作者

Norman Maurer[2]是Netty的核心開發人員之一,Apache軟件基金會的一員。在過去的幾年,他還是很多開源項目的貢獻者。他是Apple公司的一名資深軟件工程師,Netty和其他網絡相關的項目是他在iCloud團隊的工作內容。

Marvin Wolfthal[3]作為開發者、架構師、講師和作者一直活躍在多個軟件開發領域。他很早就開始使用Java,並且協助Sun開發了它第一批致力於促進分布式對象技術的程序。作為這些努力的一部分,他使用C++、Java和CORBA為Sun Education編寫了第一套跨語言的編程課程。從那時起,他的主要關注點就一直是中間件的設計和開發,主要針對金融行業。他目前是Dell Services的一名顧問,致力於將Java世界中產生的方法論拓展到其他的企業計算領域中,例如,將持續集成的實踐應用到數據庫的開發中。Marvin還是鋼琴家和作曲家,他的作品已由維也納的Universal Edition公司發行[4]。他和他的妻子凱瑟琳以及他們的3隻貓夥伴Fritz、Willy和Robbie住在馬薩諸塞州的韋斯頓。

作者在線

購買本書的讀者可以免費訪問Manning出版社運營的一個私有Web論壇[5],在那裏,可以評論本書、提技術問題,還可以獲得作者和其他用戶的幫助。如果要訪問或者訂閱該論壇,可以用Web瀏覽器訪問www.manning.com/books/netty-in-action。這個頁麵提供了以下信息:注冊之後如何訪問論壇;可以獲得什麼樣的幫助;該論壇的一些行為準則;本書示例的源代碼的鏈接、勘誤表以及其他的下載資源。

Manning承諾為我們的讀者提供一個交流場所,在那裏讀者之間以及讀者和作者之間可以進行有意義的對話。但是對於作者方麵的參與並沒有做任何數量上的承諾,作者對於作者在線(AO)的貢獻仍然是自願的(和無償的)。我們建議你向作者提一些富有挑戰性的問題,以免他們沒興趣回答!

隻要這本書尚未絕版,就可以從出版社的網站上訪問到作者在線論壇以及之前討論的存檔。


[1] 本書中文版的源代碼可以從GitHub的項目地址href=’https://github.com/ReactivePlatform/netty-in-action-cn獲取,也可以在異步社區(www.epubit.com.cn)本書頁麵下載。——譯者注

[2] Norman Maurer的個人網站是https://normanmaurer.me/,在這裏可以找到更多關於Netty的討論。——譯者注

[3] Marvin Wolfthal的個人網站是https://www.weichi.com/maw/。——譯者注

[4] 唱片的在線試聽地址是https://www.universaledition.com/composers-and-works/Marvin-Wolfthal/composer/4038。——譯者注

[5] 本書中文版的讀者也可以訪問本書在異步社區的相應頁麵。——譯者注

關於封麵插圖

本書封麵上的插畫名為“盧森堡地區的居民”(A Resident of the Luxembourg Quarter)。該插畫選自多位藝術家的19世紀作品集,由Louis Curmer編輯,並於1841年在巴黎出版。該作品集的標題是《Les Français peints par eux-mêmes》,翻譯過來是“法國人民的自畫像”。每幅插畫都是手工精細繪製和著色的,作品集中豐富多樣的作品向我們生動地展現了200年前世界上各個區域、城鎮、村莊以及居民區的文化是多麼迥異。人們彼此分開,講不同的方言和語言。僅僅通過他們的服飾就能夠很容易地辨別出他們在哪兒生活,住在城鎮裏還是住在鄉下、幹什麼工作或者有什麼樣的生活地位。

自那以後,服飾的風格已然發生了變化,當時各地如此豐富多樣的風格已經逐漸消失。現在已經很難分辨不同大洲的居民,更別說區分不同城鎮或者地區的居民了。也許我們使用文化的多樣性換取了更加多樣化的個人生活——當然也是更加多樣化和快節奏的科技生活。

在很難將一本計算機圖書與另一本區分開的時代,Manning通過使用基於兩個世紀以前的多樣化的區域生活的圖書封麵,讓作品集中的插畫重現於世,比如這一幅,借以來讚美計算機行業的創造力和進取精神。

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-18 20:36:32

  上一篇:go  《KAFKA官方文檔》5.2 APIs
  下一篇:go  分布式消息中間件Metaq發布1.4.2