1. 程式人生 > >Netty學習總結(1)——Netty入門介紹

Netty學習總結(1)——Netty入門介紹

1.Netty是什麼?

Netty是一個基於JAVA NIO類庫的非同步通訊框架,它的架構特點是:非同步非阻塞、基於事件驅動、高效能、高可靠性和高可定製性。

2.使用Netty能夠做什麼?

  • 開發非同步、非阻塞的TCP網路應用程式;

  • 開發非同步、非阻塞的UDP網路應用程式;

  • 開發非同步檔案傳輸應用程式;

  • 開發非同步HTTP服務端和客戶端應用程式;

  • 提供對多種編解碼框架的整合,包括谷歌的ProtobufJboss marshallingJava序列化、壓縮編解碼、XML解碼、字串編解碼等,這些編解碼框架可以被使用者直接使用;

  • 提供形式多樣的編解碼基礎類庫,可以非常方便的實現私有協議棧編解碼框架的二次定製和開發;

  • 基於職責鏈模式的Pipeline-Handler機制,使用者可以非常方便的對網路事件進行攔截和定製;

  • 所有的IO操作都是非同步的,使用者可以通過Future-Listener機制主動Get結果或者由IO執行緒操作完成之後主動Notify結果,使用者的業務執行緒不需要同步等待;

  • IP黑白名單控制;

  • 列印訊息碼流;

  • 流量控制和整形;

  • 效能統計;

  • 基於鏈路空閒事件檢測的心跳檢測

3.Netty在哪些行業得到了應用?

  • 網際網路行業:隨著網站規模的不斷擴大,系統併發訪問量也越來越高,傳統基於TomcatWeb容器的垂直架構已經無法滿足需求,需要拆分應用進行服務化,以提高開發和維護效率。從組網情況看,垂直的架構拆分之後,系統採用分散式部署,各個節點之間需要遠端服務呼叫,高效能的RPC
    框架必不可少,Netty作為非同步高效能的通訊框架,往往作為基礎通訊元件被這些RPC框架使用。

典型的應用有:阿里分散式服務框架DubboRPC框架使用Dubbo協議進行節點間通訊,Dubbo協議預設使用Netty作為基礎通訊元件,用於實現各程序節點之間的內部通訊。它的架構圖如下:

其中,服務提供者和服務消費者之間,服務提供者、服務消費者和效能統計節點之間使用Netty進行非同步/同步通訊。除了Dubbo之外,淘寶的訊息中介軟體RocketMQ的訊息生產者和訊息消費者之間,也採用Netty進行高效能、非同步通訊。

除了阿里系和淘寶系之外,很多其它的大型網際網路公司或者電商內部也已經大量使用Netty構建高效能、分散式的網路伺服器。

  • 遊戲行業:無論是手遊服務端、還是大型的網路遊戲,Java語言得到了越來越廣泛的應用。Netty作為高效能的基礎通訊元件,它本身提供了TCP/UDPHTTP協議棧,非常方便定製和開發私有協議棧。賬號登陸伺服器、地圖伺服器之間可以方便的通過Netty進行高效能的通訊,架構示意圖如下:

  • 大資料領域:經典的Hadoop的高效能通訊和序列化元件AvroRPC框架,預設採用Netty進行跨節點通訊,它的Netty Service基於Netty框架二次封裝實現。

大資料計算往往採用多個計算節點和一個/N個彙總節點進行分散式部署,各節點之間存在海量的資料交換。由於Netty的綜合性能是目前各個成熟NIO框架中最高的,因此,往往會被選中用作大資料各節點間的通訊。

  • 企業軟體:企業和IT整合需要ESBNetty對多協議支援、私有協議定製的簡潔性和高效能是ESB RPC框架的首選通訊元件。事實上,很多企業匯流排廠商會選擇Netty作為基礎通訊元件,用於企業的IT整合。

  • 通訊行業:Netty的非同步高效能、高可靠性和高成熟度的優點,使它在通訊行業得到了大量的應用。

4.使用傳統的Socket開發挺簡單的,我為什麼要切換到NIO進行程式設計呢?

首先我們看下傳統基於同步阻塞IO(BIO)的執行緒模型圖:

由上圖我們可以看出,傳統的同步阻塞IO通訊存在如下幾個問題:l執行緒模型存在致命缺陷:一連線一執行緒的模型導致服務端無法承受大量客戶端的併發連線;

  • 效能差:頻繁的執行緒上下文切換導致CPU利用效率不高;

  • 可靠性差:由於所有的IO操作都是同步的,所以業務執行緒只要進行IO操作,也會存在被同步阻塞的風險,這會導致系統的可靠性差,依賴外部元件的處理能力和網路的情況。

採用非阻塞IONIO)之後,同步阻塞IO的三個缺陷都將迎刃而解:

  • Nio採用Reactor模式,一個Reactor執行緒聚合一個多路複用器Selector,它可以同時註冊、監聽和輪詢成百上千個Channel,一個IO執行緒可以同時併發處理N個客戶端連線,執行緒模型優化為1NN < 程序可用的最大控制代碼數)或者 M : N (M通常為CPU核數+ 1N < 程序可用的最大控制代碼數)

  • 由於IO執行緒總數有限,不會存在頻繁的IO執行緒之間上下文切換和競爭,CPU利用率高;

  • 所有的IO操作都是非同步的,即使業務執行緒直接進行IO操作,也不會被同步阻塞,系統不再依賴外部的網路環境和外部應用程式的處理效能。

由於切換到NIO程式設計之後可以為系統帶來巨大的可靠性、效能提升,所以,目前採用NIO進行通訊已經逐漸成為主流。

5.為什麼不直接基於JDKNIO類庫程式設計呢?

我們通過JDK NIO服務端和客戶端的工作時序圖來回答下這個問題:

即便拋開程式碼和NIO類庫複雜性不談,一個高效能、高可靠性的NIO服務端開發和維護成本都是非常高的,開發者需要具有豐富的NIO程式設計經驗和網路維護經驗,很多時候甚至需要通過抓包來定位問題。也許開發出一套NIO程式需要1個月,但是它的穩定很可能需要1年甚至更長的時間,這也就是為什麼我不建議直接使用JDK NIO類庫進行通訊開發的一個重要原因。

下面再一起看下JDK NIO客戶端的通訊時序圖:它同樣非常複雜:

6.為什麼要選擇Netty框架?

Netty是業界最流行的NIO框架之一,它的健壯性、功能、效能、可定製性和可擴充套件性在同類框架中都是首屈一指的,它已經得到成百上千的商用專案驗證,例如HadoopRPC框架Avro使用Netty作為通訊框架。很多其它業界主流的RPC和分散式服務框架,也使用Netty來構建高效能的非同步通訊能力。

Netty的優點總結如下:

  • API使用簡單,開發門檻低;

  • 功能強大,預置了多種編解碼功能,支援多種主流協議;

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

  • 效能高,通過與其它業界主流的NIO框架對比,Netty的綜合性能最優;

  • 成熟、穩定,Netty修復了已經發現的所有JDK NIO BUG,業務開發人員不需要再為NIOBUG而煩惱;

  • 社群活躍,版本迭代週期短,發現的BUG可以被及時修復,同時,更多的新功能會被加入;

  • 經歷了大規模的商業應用考驗,質量得到驗證。在網際網路、大資料、網路遊戲、企業應用、電信軟體等眾多行業得到成功商用,證明了它完全滿足不同行業的商用標準。

正是因為這些優點,Netty逐漸成為Java NIO程式設計的首選框架。

7.聽說Netty各版本的API變化比較頻繁,我該如何選擇版本?

事實上,Netty各版本之間的API變更並沒有一些人講的那麼可怕,最大的變更就是3.X系列到4.X/5.X的變更,Netty不僅僅重構了包路徑,對於之前一直想改但是考慮到前向相容性沒改的類庫進行了優化和修改。這次變更的主要原因是Netty脫離了Jboss獨立發展,這對於Netty的長遠發展是件好事。

在我看來,Netty4.X系列版本的架構和API設計更加合理,同時,它提供了更多新的特性。因此,我個人建議使用者可以選擇4.X系列版本,以免未來升級遇到困難和問題。

對於已經使用3.X系列版本的使用者,如果現有功能已經滿足需求,短期內暫時不需要升級。如果需要使用更多新特性和功能,建議在充分評估之後進行升級,這可能需要一些工作量。

由於Netty5最新版本仍處於測試階段,從學習和研究角度可以試用一下,Netty5相比於Netty4是前向相容的,因此,未來使用者升級到Netty5會更加容易。

8.NettyMina 我究竟該選擇哪個?

根據我的經驗,無論選擇哪個,都是個正確的選擇。兩者各有千秋,Netty在記憶體管理方面更勝一籌,綜合性能也更優。但是,API變更的管理和相容性做的不是太好。相比於NettyMina的前向相容性、內聚的可維護性功能更多,例如JMX的整合、效能統計、狀態機等。

建議使用者可以根據自己對兩者的熟悉程度和實際專案需求,做出最佳選擇。如果你鎖定了兩者,本身就意味著你做出了正確選擇,不需要再糾結於選擇哪個而和領導、同事吵得面紅耳赤。

9.Netty使用簡單嗎?

Netty的基礎開發和應用非常簡單,開發一個Echo服務端只需要28行程式碼,開發對應的Echo客戶端只需要26行程式碼!

但是,如果你要利用它進行私有協議棧開發、HTTP服務端和客戶端開發等,仍然需要深入的學習Netty的一些高階類庫和功能,瞭解Netty的設計原理。只有這樣,才能恰到好處的使用Netty,為專案和公司帶來更大的價值。

10.有沒有Netty相關的書籍供學習和參考?

目前市面上有兩本Netty書籍,《Netty in Action》和 《Netty權威指南》。

11.我是大學畢業生,正在學習Java NIO,聽說掌握NettyNIO框架對未來找工作很有幫助?

從我的經驗和目前Netty的行業應用情況,確實如此。下面我們簡單看下以Netty招聘為關鍵字的搜尋結果:

隨著移動網際網路和物聯網的發展,Netty在非傳統行業的應用也日益廣泛,例如手機移動推送服務、智慧傢俱、物聯閘道器等。

相關推薦

Netty學習總結1——Netty入門介紹

1.Netty是什麼? Netty是一個基於JAVA NIO類庫的非同步通訊框架,它的架構特點是:非同步非阻塞、基於事件驅動、高效能、高可靠性和高可定製性。 2.使用Netty能夠做什麼?

Tomcat學習總結1——Tomcat入門教程

一、Tomcat伺服器埠的配置  Tomcat的所有配置都放在conf資料夾之中,裡面的server.xml檔案是配置的核心檔案。  如果想修改Tomcat伺服器的啟動埠,則可以在server.xml配

爬蟲入門學習總結1——使用正側表示式並寫入CSV

目標:抓取目標網站用正側表示式並寫入CSV裡。 進度:基本達成目標,但還是有些小問題沒有解決 存在的疑問: ide中呼叫執行檔案不能顯示完整 有些網站不能讀取完 為什麼會有換位符號,是因為js解析嗎 還沒解決的技術性問題: yield的具體用法 CSV寫入為什麼

Spring Boot學習總結1——Spring Boot入門

摘要:Spring Boots是為了幫助開發人員很容易的創建出獨立執行和產品級別的基於 Spring 框架的應用。 從 Spring Boot 專案名稱中的 Boot 可以看出來,Spring

ActiveMQ學習總結1——ActiveMQ快速入門

1.下載ActiveMQ 2.執行ActiveMQ 解壓縮apache-activemq-5.5.1-bin.zip,然後雙擊apache-activemq-5.5.1\bin\activemq.bat執行ActiveMQ程式。 3.建立Eclipse專案並執行

DB2學習總結1——DB2資料庫基礎入門

DB2的特性 完全Web使能的:可以利用HTTP來發送詢問給伺服器。 高度可縮放和可靠:高負荷時可利用多處理器和大記憶體,可以跨伺服器地分佈資料庫和資料負荷;能夠以最小的資料丟失快速地恢復,提供

Spring Cloud與微服務學習總結1——Spring Cloud及微服務入門

一、Spring Cloud是什麼鬼? Spring Cloud為開發者提供了快速建立一些常見的模式在分散式系統的工具(如配置管理、服務發現、斷路器、智慧路由、微代理,控制匯流排,一次性令牌,全球鎖,領

MEF學習總結1---總體架構

attr 總結 技術分享 dir target get gre round 管理 用了很久的MEF框架來做依賴註入,最近想把它的原理和機構總結一下,主要包括如下幾個方面: 1. 總體架構 2. .Net Composition Primitive 3. Attribu

Spring-Batch學習總結1——重要概念,環境搭建,名詞解釋,第一個項目及異常處理

img truct 設定 uil sna sta col key services Spring-batch框架學習總結(1)一.初識Spring-batch框架:1.核心名詞解釋:Job:是Spring-batch框架的核心概念,它包含了批處理的所有操作Step:每一個J

phthon學習總結1

pytho 保留字 大小寫 特殊字符 int 開頭 字母數 操作 定義 1、print("hello word") 2、變量、常量:   變量是存儲信息、方便調用、修改操作   常量固定不變的量,python用字母大寫區分。無常量。 命名規則: 1)字母數字下劃線組成。 2

Redis學習總結1——Redis記憶體資料庫詳細教程

1.Redis是什麼 2.redis的作者何許人也 3.誰在使用redis 4.學會安裝redis 5.學會啟動redis 6.使用redis客戶端 7.redis資料結構 – 簡介 8.redis資料結構 – strings 9.redis資料結構 – lists 10.redis

事務學習總結1——事務的基本概念

一:什麼是事務?     對資料庫讀寫一系列操作的合集。     具有"ACID"的特性,即原子性、一致性、隔離性、永續性。     核心點是鎖與併發。 二:主要用在哪些場景?解決了什麼問題?    

《實戰Java高併發程式設計》學習總結1

第1章 走入並行世界 1 併發(Concurrency)和並行(Parallelism)都可以表示兩個或多個任務一起執行。但併發偏重於多個任務交替執行,而多個任務之間有可能還是序列。並行是真正意義上的“同時執行”。 2 有關並行的兩個重要定律。Amdahl定律強調當序列比例一定時,加速比是有

設計模式學習總結1簡單工廠模式、工廠方法模式、抽象工廠模式

設計模式學習 做了幾個專案,發現設計模式的好處還是很多的,這東西就是隻有你真正用到的時候才知道他的好處,否則學了也不知道所以然。所以設計模式學習我認為可以在先進行幾個專案後,再來學習,這樣學習的效果和感受才是最好的。 這次是做一個學習的筆記,內容還是主要以我看的兩本書《大

訊息中介軟體學習總結1——RocketMQ之專訪RocketMQ聯合創始人:專案思路、技術細節和未來規劃

編者按 這些年開源氛圍越來越好,各大IT公司都紛紛將一些自研程式碼開源出來。2012年,阿里巴巴開源其自研的第三代分散式訊息中介軟體——RocketMQ。經過幾年的技術打磨,阿里稱基於RocketMQ技術,目前雙十一當天訊息容量可達到萬億級。 2016年11月,阿里將Ro

Maven學習總結1-maven概述

1.基本概念        Maven是跨平臺的專案管理工具。主要服務於基於Java的專案構建,負責依賴管理和專案資訊管理。(Maven帶來一種全新的專案構建方式,負責統一開發規範和工具,統一管理jar包。) 2.專案構建   專案構建過程包括【清

Shiro學習筆記1——shiro入門

                     1.建立一個簡單shiro專案建立一個java工程加入shiro需要的jar包 在src下建立log4j配置檔案(非必需步驟,可以跳過)## Licensed to the Apache Software Foundation (ASF) under one# or

許可權系統設計學習總結1——多租戶的RBAC許可權管理

一、公司(Company)   公司包含了體系結構集合與使用者集合。 公司可以存在上下級關係,這種關係僅限於展現形式,公司與公司之間沒有許可權繼承,也就是說在授權管理中公司之間全部是扁平關係。公司的屬性有以下內容: 屬性 型別 公司編碼 字串 公司名稱

YUI學習總結1

看了 YUI2 有一段時間了,在這紀錄一下自己的一些總結 。歡迎大家有不同的見解,可以給我留言。 再看英文文件及原始碼之前, 我試著 搜了下網路中寫的比較好的一些 YUI 總結: 在這裡列出(在些也感謝你們的分享): 先討論下YAHOO Global Object

PL/SQL學習總結1

PL/SQL是一種面向過程的類似Pascal的語言,是Oracle公司對SQL語言的功能的擴充套件,它是將過程性結構與oracle SQL無縫的整合在一起而產生的一種結構化的強有力的語言,是一種高階資料庫程式設計語言。 1、程式開始