1. 程式人生 > >《Netty實戰》Netty In Action中文版——文前內容

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

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,要把它替換為所需的內容。

關於作者

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)的貢獻仍然是自願的(和無償的)。我們建議你向作者提一些富有挑戰性的問題,以免他們沒興趣回答!

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

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

[5] 本書中文版的讀者也可以訪問本書在非同步社群的相應頁面。——譯者注

關於封面插圖

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

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