1. 程式人生 > >Netty 從零到一學習系列之初識篇

Netty 從零到一學習系列之初識篇

由於專案開發中需要用的網路通訊,就研究了一下Netty的使用方法、原理及原始碼。現在總結學習新的及經驗分享給大家。

一、為什麼不選擇Java原生的NIO

       在JDK1.4版本中已經引入了NIO,NIO彌補了原來同步阻塞I/O的不足,它在Java程式碼中提供了高速的、面向塊的I/O。

      為什麼不選擇Java原生的NIO主要體現在以下幾方面:

       1、NIO的類庫和API複雜

             在使用Java原生NIO需要熟練掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等類庫或AIP。而這些類都相當的繁瑣,不宜掌握。

        2、需要其他技能的鋪墊

             NIO主要是非阻塞網路I/O,多路複用等技術,由於NIO程式設計涉及到了Reactor執行緒模式程式設計,需要熟練掌握Java的多執行緒程式設計技術。而Java的多執行緒程式設計技術又是一個相當複雜難以掌握的技能。

         3、可靠效能力補齊,難度和共工作量都非常大

             在網路程式設計中客戶端面臨著斷連重連、網路閃斷、讀寫半包、快取失敗、碼流控制和網路控制等複雜的問題處理。所以NIO程式設計的特點是功能實現容易,但是可靠效能力補齊工作量和難度都非常大。

         4、JDK  NIO的缺陷。NIO可能會導致Selector的空輪詢,最終導致CPU 使用達到100%,導致系統宕機。       

二、為什麼選擇Netty

   首先Netty是一個基於NIO實現的事件驅動的非同步網路應用框架。Netty大大簡化了TCP和UDP等網路程式的開發步驟,其從FTP、SMTP、HTTP、許多二進位制和基於文字的傳統協議等協議中吸取了經驗,使得Netty在開發效率、效能、穩定性、靈活性等方面都有優異的表現。其次Netty也是業界流行的NIO框架之一,其它的健壯性、效能、功能、可定製性和可擴充套件性等方面都首屈一指。

        使用Netty的原因主要有以下幾方面:

        1、API使用簡單,開發門檻低。

        2、功能強大,內建了多種編碼功能,支援多種主流協議

        3、定製能力強,可以通過ChannelHandler對通訊框架進行靈活的擴充套件。

        4、效能高,通過與其他框架相比較,Netty的綜合性能最優。

        5、成熟、穩定,Netty修復了JDK NIO的BUG,在開發過程中不需要關心這些BUG。

        6、社群活躍,版本的迭代週期短,發現BUG能夠及時進行修復。

        7、經歷了大規模的商業應用實踐,質量得到了驗證,其在網際網路、大資料、網路遊戲、企業應用等方面都得到了應用。

說明:在學習過程中主要參考了  《Netty實踐》、《Netty權威指南第二版》和網路部落格。寫此部落格主要是作為學習筆記,增強記憶。

相關推薦

Netty 學習系列初識

由於專案開發中需要用的網路通訊,就研究了一下Netty的使用方法、原理及原始碼。現在總結學習新的及經驗分享給大家。 一、為什麼不選擇Java原生的NIO        在JDK1.4版本中已經引入了NIO,NIO彌補了原來同步阻塞I/O的不足,它在Java程式碼中提供了高

Netty 學習系列番外

    要搞懂Netty首先需要了解什麼是非同步I/O?什麼是同步I/O?什麼是阻塞I/O?什麼是非阻塞I/O? 在《UNIX網路程式設計》一書中介紹了五種I/O模型。分別為:阻塞I/O模型、非阻塞I/O模型、I/O多路複用模型、訊號驅動I/O模型和非同步I/O模型。下面分別

開始學習ZigBeeTI-Zstack初識及環境搭建()

       EW8051 10.10.1 (10.10.1) for CC2530 and CC2531 Wireless MCU,可以從各自官網下載,博主下載最新的EW8051 10.20版本,破解檔案自行從網上查詢。下載完成後自行解壓安裝。       安裝完成後,首先

Python基礎學習系列二--Python介紹及環境搭建

url 軟件包 三方庫 簡單的 lin 文件的 span 高級程序設計 擴展 1-1、Python簡介:  Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年

Java0開始學習系列路(6)

前言--- 明天週末了,打算用來整理一下資料庫,Cisco命令和Linux,這篇部落格寫完之後就打算滾回宿舍休息了,路上順便買下水果,補充補充維C。 前言補充---- 突然被管教學樓的老師給清出教室了,由於教室明後天要當某證書的考場,這種做事被打擾的感覺實在是難受。不過

敏捷開發系列十七 長期受制於強勢客戶怎麼辦 (上)

                這是敏捷開發一千零一問系列的第十七篇。(在這裡提問,之一,之二,之三,問題總目錄)這個是在一次面向電信行業供應商的公開課上提出的問題,被評為本場最佳問題。對於這類“供應商”而言,一方面業務根深蒂固,一般固化在某些專有領域因此很有必要產品化;另一方面又受制於客戶總是來回改動,很難

敏捷開發系列十五 同時實施CMMI和敏捷哪個為主

                這是敏捷開發一千零一問系列的第十五篇。(在這裡提問,之一,之二,之三,問題總目錄)也是敏捷與CMMI系列的第三篇。(總目錄)問題原來問題是這麼寫的:“一家企業既要過CMMI,又要過ISO,還要實施敏捷,應該怎樣做?”之所以改成“哪個好”,是因為如果要多頭並存,就要有主次關係。那

基礎學習 Python 初識生成器

寫在之前 昨天的文章中(Python 拓展之迭代器)我們學了「迭代器」,今天我們就來學學另一個 – 「生成器」。如果不出意外的話,「生成器」這個部分是我們在“類”裡面的最後一個知識點,堅持就是勝利。 生成器 不知道你還記得麼,在昨天出現了一個單詞我們還沒說: >&g

敏捷開發系列十三:故事點好還是人天好?

這是敏捷開發一千零一問系列的第十三篇。(在這裡提問,之一,之二,之三,問題總目錄) 問題 這是課堂上提的一個問題,這是一家外企,PO在國外,研發在國內;PO希望大家用故事點估算,而團隊習慣用人天估算,問用哪個好,或者兩個都用好? 分析 先分析,後出方案。 這個是一個典型的有

敏捷開發系列三十四:如何弄清楚專案需求(需求開發步驟)?

這是敏捷開發一千零一問系列的第三十三篇。(在這裡提問,之一,之二,之三,問題總目錄)也是敏捷開發使用者故事系列的第十篇(欄目目錄)。問題需求清晰到什麼程度可以進行開發?一定要弄清楚需求才能開發嗎?怎樣才能弄清楚需求?注意下面的分析是在基於合同的專案開發的語境中的。產品和網際網

敏捷開發系列十四:敏捷開發加班嗎?

這是敏捷開發一千零一問系列的第十四篇。(在這裡提問,之一,之二,之三,問題總目錄)正逢週末,又是愚人節,群中有人正在加班,想起上次培訓中間休息的時候,討論起這個“敏捷開發加班嗎”的問題,雖然後來沒有作為課後投票入選,但這裡也完整回答一下。問題敏捷開發加班嗎?樓下有人問到“敏捷

敏捷開發系列二十六:如何進行優先順序排序?

這是敏捷開發一千零一問系列的第二十六篇。(在這裡提問,之一,之二,之三,問題總目錄)問題如何進行優先順序排序?具體故事的優先順序,和版本規劃的優先順序之間有何關係?分析敏捷開發裡邊有很多地方需要多次進行優先順序排序,本文將探討其不同的應用場景,及其關係。值得注意的一點是,敏捷

敏捷開發系列三十八:計劃撲克就是打不出個結果怎麼辦?

本文是敏捷開發一千零一問的第三十八篇。(欄目總目錄)問題:一個簡單的問題,計劃撲克就是打不出個結果,各持己見怎麼辦?也就是少數人無法說服大家,或者說根本無人去聽回答:計劃撲克的結束條件”近似一致“是個很有趣的標準,其實要回答”什麼時候停止打撲克“,就要先解決”為什麼要打撲克“

敏捷開發系列三十六:如何做小版本迭代的程式碼管理

本文是敏捷開發一千零一問的第三十五篇。(欄目總目錄)問題若要實現敏捷式的開發,對產品進行迭代式的小版本的釋出,在程式碼管理方面應該怎麼樣管理呢?我們目前的管理是在一個大的版本上不斷的遞增新的需求……但是要是有個需求做到一半,領導又要求做更重要的需求的情況,就很難將開發一半的程

正則表示式開始學習系列(二)

正則表示式學習 -- 實踐     如何讓一個完全沒接觸過正則表示式的人去快速有效的學會正則表示式?這的確是個很難回答的問題。不過我想最好的方式就是把自己當成這麼一個人,然後把自己的學習過程分享出來,想必是個比較不錯的方式。     現在,我將打算去做這麼一件事,希望對

開始學習Gradle之一---初識Gradle

前提: 安裝Gradle。安裝過程非常簡單: (1)下載Gradle (2)將GRADLE_HOME/bin/gradle加入$PATH。 1. 基本概念(Project 和 Task) Gradle中有兩個基本的概念:project和task。每個Gradle的構建由一

開始學習Gradle三---多專案構建

   隨著資訊化的快速發展,IT專案變得越來越複雜,通常都是由多個子系統共同協作完成。對於這種多系統、多專案的情況,很多構建工具都已經提供了不錯的支援,像maven、ant。Gradle除了借鑑了ant或者maven的繼承的方式定義子專案,也提供了一種更為方便的集中配置的方式,大大減少了構建帶來的複雜度。

開始學習Memcached安裝&set命令測試

    Memcached是一個自由開源的,高效能,分散式記憶體物件快取系統,是一種基於記憶體的key-value儲存,用來儲存小塊的任意資料(字串、物件)。這些資料可以是資料庫呼叫、API呼叫或者是頁

開始學習Redis管道技術

    Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。這意味著通常情況下一個請求會遵循以下步驟:客戶端向服務端傳送一個查詢請求,並監聽Socket返回,通常是以阻塞模式,等待服務

開始學習Redis鍵(key)命令測試

    Redis 鍵命令用於管理 redis 的鍵。Redis 鍵命令的基本語法如下:redis 127.0.0.1:6379> COMMAND KEY_NAME    來看個簡單的例子:red