通俗地講,Netty 能作什麼?

https://www.zhihu.com/question/24322387/answer/78947405java

 

 

做者:郭無意
連接:https://www.zhihu.com/question/24322387/answer/78947405
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

Netty是什麼?react

1)本質:JBoss作的一個Jar包linux

2)目的:快速開發高性能、高可靠性的網絡服務器和客戶端程序nginx

3)優勢:提供異步的、事件驅動的網絡應用程序框架和工具c++

通俗的說:一個好使的處理Socket的東東程序員


若是沒有Netty?web

遠古:spring

java.net + java.io

近代:數據庫

java.nio

其餘:apache

Mina,Grizzly

與Mina相比有什麼優點?

一、都是Trustin Lee的做品,Netty更晚;

二、Mina將內核和一些特性的聯繫過於緊密,使得用戶在不須要這些特性的時候沒法脫離,相比下性能會有所降低,Netty解決了這個設計問題;

三、Netty的文檔更清晰,不少Mina的特性在Netty裏都有;

四、Netty更新週期更短,新版本的發佈比較快;

五、它們的架構差異不大,Mina靠apache生存,而Netty靠jboss,和jboss的結合度很是高,Netty有對google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);

六、Netty比Mina使用起來更簡單,Netty裏你能夠自定義的處理upstream events 或/和 downstream events,可使用decoder和encoder來解碼和編碼發送內容;

七、Netty和Mina在處理UDP時有一些不一樣,Netty將UDP無鏈接的特性暴露出來;而Mina對UDP進行了高級層次的抽象,能夠把UDP當成"面向鏈接"的協議,而要Netty作到這一點比較困難。

-----------------------------------------------------------------------------------------------------------------------------------------

Netty的特性

1)設計

統一的API,適用於不一樣的協議(阻塞和非阻塞)

基於靈活、可擴展的事件驅動模型

高度可定製的線程模型

可靠的無鏈接數據Socket支持(UDP)


2)性能

更好的吞吐量,低延遲

更省資源

儘可能減小沒必要要的內存拷貝


3)安全

完整的SSL/TLS和STARTTLS的支持

能在Applet與Android的限制環境運行良好


4)健壯性

再也不因過快、過慢或超負載鏈接致使OutOfMemoryError

再也不有在高速網絡環境下NIO讀寫頻率不一致的問題


5)易用

完善的JavaDoc,用戶指南和樣例

簡潔簡單

僅信賴於JDK1.5


-------------------------------------------------------------------------------------------------------------------------------------------

Netty 在哪些行業獲得了應用?

  • 互聯網行業:隨着網站規模的不斷擴大,系統併發訪問量也愈來愈高,傳統基於 Tomcat 等 Web 容器的垂直架構已經沒法知足需求,須要拆分應用進行服務化,以提升開發和維護效率。從組網狀況看,垂直的架構拆分以後,系統採用分佈式部署,各個節點之間須要遠程服務調用,高性能的 RPC 框架必不可少,Netty 做爲異步高性能的通訊框架,每每做爲基礎通訊組件被這些 RPC 框架使用。

  典型的應用有:阿里分佈式服務框架 Dubbo 的 RPC 框架使用 Dubbo 協議進行節點間通訊,Dubbo 協議默認使用 Netty 做爲基礎通訊組件,用於實現各進程節點之間的內部通訊。它的架構圖以下:




其中,服務提供者和服務消費者之間,服務提供者、服務消費者和性能統計節點之間使用 Netty 進行異步/同步通訊。

  除了 Dubbo 以外,淘寶的消息中間件 RocketMQ 的消息生產者和消息消費者之間,也採用 Netty 進行高性能、異步通訊。

  除了阿里系和淘寶系以外,不少其它的大型互聯網公司或者電商內部也已經大量使用 Netty 構建高性能、分佈式的網絡服務器。

  • 遊戲行業:不管是手遊服務端、仍是大型的網絡遊戲,Java 語言獲得了愈來愈普遍的應用。Netty 做爲高性能的基礎通訊組件,它自己提供了 TCP/UDP 和 HTTP 協議棧,很是方便定製和開發私有協議棧。帳號登錄服務器、地圖服務器之間能夠方便的經過 Netty 進行高性能的通訊,架構示意圖以下:



  圖1-2 Netty 在遊戲服務器架構中的應用

  • 大數據領域:經典的 Hadoop 的高性能通訊和序列化組件 Avro 的 RPC 框架,默認採用 Netty 進行跨節點通訊,它的 Netty Service 基於 Netty 框架二次封裝實現。

  大數據計算每每採用多個計算節點和一個/N個彙總節點進行分佈式部署,各節點之間存在海量的數據交換。因爲 Netty 的綜合性能是目前各個成熟 NIO 框架中最高的,所以,每每會被選中用做大數據各節點間的通訊。

  • 企業軟件:企業和 IT 集成須要 ESB,Netty 對多協議支持、私有協議定製的簡潔性和高性能是 ESB RPC 框架的首選通訊組件。事實上,不少企業總線廠商會選擇 Netty 做爲基礎通訊組件,用於企業的 IT 集成。

  • 通訊行業:Netty 的異步高性能、高可靠性和高成熟度的優勢,使它在通訊行業獲得了大量的應用。

做爲一個學Java的,若是沒有研究過Netty,那麼你對Java語言的使用和理解僅僅停留在表面水平,會點SSH,寫幾個MVC,訪問數據庫和緩存,這些只是初等Java程序員乾的事。若是你要進階,想了解Java服務器的深層高階知識,Netty絕對是一個必需要過的門檻。

有了Netty,你能夠實現本身的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的Proxy服務器等等。

若是你想知道Nginx是怎麼寫出來的,若是你想知道Tomcat和Jetty是如何實現的,若是你也想實現一個簡單的Redis服務器,那都應該好好理解一下Netty,它們高性能的原理都是相似的。

咱們回顧一下傳統的HTTP服務器的原理

  1. 建立一個ServerSocket,監聽並綁定一個端口
  2. 一系列客戶端來請求這個端口
  3. 服務器使用Accept,得到一個來自客戶端的Socket鏈接對象
  4. 啓動一個新線程處理鏈接
    1. 讀Socket,獲得字節流
    2. 解碼協議,獲得Http請求對象
    3. 處理Http請求,獲得一個結果,封裝成一個HttpResponse對象
    4. 編碼協議,將結果序列化字節流
    5. 寫Socket,將字節流發給客戶端
  5. 繼續循環步驟3

HTTP服務器之因此稱爲HTTP服務器,是由於編碼解碼協議是HTTP協議,若是協議是Redis協議,那它就成了Redis服務器,若是協議是WebSocket,那它就成了WebSocket服務器,等等。

使用Netty你就能夠定製編解碼協議,實現本身的特定協議的服務器。

上面咱們說的是一個傳統的多線程服務器,這個也是Apache處理請求的模式。在高併發環境下,線程數量可能會建立太多,操做系統的任務調度壓力大,系統負載也會比較高。那怎麼辦呢?

因而NIO誕生了,NIO並非Java獨有的概念,NIO表明的一個詞彙叫着IO多路複用。它是由操做系統提供的系統調用,早期這個操做系統調用的名字是select,可是性能低下,後來漸漸演化成了Linux下的epoll和Mac裏的kqueue。咱們通常就說是epoll,由於沒有人拿蘋果電腦做爲服務器使用對外提供服務。而Netty就是基於Java NIO技術封裝的一套框架。爲何要封裝,由於原生的Java NIO使用起來沒那麼方便,並且還有臭名昭著的bug,Netty把它封裝以後,提供了一個易於操做的使用模式和接口,用戶使用起來也就便捷多了。

那NIO到底是什麼東西呢?

NIO的全稱是NoneBlocking IO,非阻塞IO,區別與BIO,BIO的全稱是Blocking IO,阻塞IO。那這個阻塞是什麼意思呢?

  1. Accept是阻塞的,只有新鏈接來了,Accept纔會返回,主線程才能繼
  2. Read是阻塞的,只有請求消息來了,Read才能返回,子線程才能繼續處理
  3. Write是阻塞的,只有客戶端把消息收了,Write才能返回,子線程才能繼續讀取下一個請求

因此傳統的多線程服務器是BlockingIO模式的,從頭至尾全部的線程都是阻塞的。這些線程就乾等在哪裏,佔用了操做系統的調度資源,什麼事也不幹,是浪費。

那麼NIO是怎麼作到非阻塞的呢。它用的是事件機制。它能夠用一個線程把Accept,讀寫操做,請求處理的邏輯全乾了。若是什麼事都沒得作,它也不會死循環,它會將線程休眠起來,直到下一個事件來了再繼續幹活,這樣的一個線程稱之爲NIO線程。

while true { events = takeEvents(fds) // 獲取事件,若是沒有事件,線程就休眠 for event in events { if event.isAcceptable { doAccept() // 新連接來了 } elif event.isReadable { request = doRead() // 讀消息 if request.isComplete() { doProcess() } } elif event.isWriteable { doWrite() // 寫消息 } } } 

NIO的流程大體就是上面的僞代碼描述的過程,跟實際真實的代碼有較多差別,不過對於初學者,這樣理解也是足夠了。

Netty是創建在NIO基礎之上,Netty在NIO之上又提供了更高層次的抽象。

在Netty裏面,Accept鏈接可使用單獨的線程池去處理,讀寫操做又是另外的線程池來處理。

Accept鏈接和讀寫操做也可使用同一個線程池來進行處理。而請求處理邏輯既可使用單獨的線程池進行處理,也能夠跟放在讀寫線程一塊處理。線程池中的每個線程都是NIO線程。用戶能夠根據實際狀況進行組裝,構造出知足系統需求的併發模型。

Netty提供了內置的經常使用編解碼器,包括行編解碼器[一行一個請求],前綴長度編解碼器[前N個字節定義請求的字節長度],可重放解碼器[記錄半包消息的狀態],HTTP編解碼器,WebSocket消息編解碼器等等

Netty提供了一些列生命週期回調接口,當一個完整的請求到達時,當一個鏈接關閉時,當一個鏈接創建時,用戶都會收到回調事件,而後進行邏輯處理。

Netty能夠同時管理多個端口,可使用NIO客戶端模型,這些對於RPC服務是頗有必要的。

Netty除了能夠處理TCP Socket以外,還能夠處理UDP Socket。

在消息讀寫過程當中,須要大量使用ByteBuffer,Netty對ByteBuffer在性能和使用的便捷性上都進行了優化和抽象。

總之,Netty是Java程序員進階的必備神奇。若是你知其然,還想知其因此然,必定要好好研究下Netty。若是你以爲Java枯燥無謂,Netty則是從新開啓你對Java興趣大門的鑰匙。

Netty能用來作什麼呢?
Netty是爲了簡化高性能網絡應用程序的開發。若是你須要開發網絡應用,有服務器,有客戶端,有基於TCP或UDP的網絡協議,Netty能提供高性能的網絡通信機制,提供基於事件和流水線的編程模型,提供一些協議的支持,好比HTTP,WebSockets,SSL等。用Netty,你能夠容易地利用Java NIO來提升服務端的性能。

有什麼Netty的例子嗎?
你下載Netty,裏面有不少例子能夠學習。

哪些企業用到了Netty?
Netty自己只是個網絡通信框架,並非像Oracle,Nginx,Hadoop那樣企業能夠直接安裝使用。不少網絡應用,RPC,分佈式框架都有使用Netty進行網絡通信。

Netty學習難度大嗎?
難度大不大都是相對而言,小馬過河的例子你們都知道。

Netty自己只是提供一種方便網絡編程(特別是NIO)的工具,若是你熟悉TCP/IP,網絡編程和NIO,那麼Netty難度並不大,一個helloworld半天就能上手,也許一週就可使用了。

若是你不熟悉TCP/IP,網絡編程和NIO,那麼就先熟悉這些技術。

相對於Tomcat這種Web Server(顧名思義主要是提供Web協議相關的服務的),Netty是一個Network Server,是處於Web Server更下層的網絡框架,也就是說你可使用Netty模仿Tomcat作一個提供HTTP服務的Web容器。

簡而言之,Netty經過使用NIO的不少新特性,對TCP/UDP編程進行了簡化和封裝,提供了更容易使用的網絡編程接口,讓你能夠根據本身的須要封裝獨特的HTTP Server活着FTP Server等.

謝邀.netty是一套在java NIO的基礎上封裝的便於用戶開發網絡應用程序的api. 應用場景不少,諸如阿里的消息隊列(RocketMQ),分佈式rpc(Dubbo)通訊層都使用到了netty(dubbo能夠用服務發現自由選擇通訊層). 主要優勢我的總結以下:

1. netty是非阻塞事件驅動框架, 並結合線程組(group)的概念,能夠很好的支持高併發,慢鏈接的場景。

2. 編程接口很是容易,而且也較好的解決了TCP粘包/拆包的問題.netty提供了本身的ByteBuf和channel,相比於jdk的ByteBuffer和channel來講更簡便靈活操做, 並提供了pipeline的概念,並針對每一個contextHandler均可以由用戶定義, 方便直接.

3. 有一些web框架已經開始直接使用netty作爲底層通訊服務,諸如play. 這樣play就不用依賴於容器去進行部署,在沒有nginx作反向代理的狀況下也能支持高併發.編解碼器能夠隨意擴展,今天是個web,明天就能夠是一個ftp或email服務器,我的以爲比較靈活。
netty是優秀的JAVA網絡應用程序框架,關鍵詞是NIO和異步。它提供了對JAVA網絡編程API的封裝,屏蔽了繁雜的編程細節,讓開發者能夠更加專一於業務邏輯的實現。不少中間件都是基於netty來實現的,你能夠用來實現一個web容器,也能寫一個遊戲服務器。學習netty可以讓你更加熟悉網絡編程,對我的好處仍是比較大的。至於學習時間,看我的而言,有JAVA NIO編程經驗和網絡編程經驗上手會更加快。

簡單來講,netty作了jdk應該作的事兒。
jdk強迫你必須用socket來寫服務器,其實是很繁瑣的。缺少一個高層次的api。
netty說,我來寫jdk的socket,並給你一個新的更簡潔的api,你傻瓜式的就能寫好一個網絡服務器(並且是event-driven/proactor/reactor等等)。

固然,netty經過jni,引入了epoll這樣的linux系統調用,使得它不僅僅是jdk的一個簡單包裹,的確也加了些東西進去。

p.s. event-driven/proactor/reactor這些概念請看這裏:
I/O多路複用技術(multiplexing)是什麼? - 趙老師的回答
普通的服務器10000個鏈接須要10000個線程,服務器可能就直接卡住了,但對於netty服務器可能幾個線程就夠了

netty 是對 socket 網絡編程的優秀包裝

原來用手動工具作木工,如今全套電動工具,省力省時還精準,價格便宜量又足,

用了netty後,腰不酸了,脖子也不疼了,想啥啥來,吃嘛嘛香:-)

netty 知足了過去用 socket 進行網絡編程時的幾乎全部美好願景:

易用,健壯,高性能,安全

感謝 netty 的貢獻者們,感謝開源世界


固然,前提是至少得了解 socket 網絡編程原理,及其面臨的問題,才更容易理解netty爲何讓網絡編程美好許多

很是喜歡的框架,若是比較一下 c++的一些網絡框架,更加會以爲在簡單易用上 Netty 設計的多麼好。符合直覺的 apI 設計,同時不失靈活和功能強大。在性能上因爲在設計和細節上優化掉了很是多的沒必要要開銷,不輸甚至過若干c++框架。若是想用 java 高性能處理網絡 io ,目前Netty 絕對是首遠。
  1. 不管是BIO仍是NIO,不管是Tomcat仍是Netty,支持的鏈接數是有限的,意味着工做線程也是有限的。所以每一個工做線程的效率,就很關鍵。如何提升工做效率?
  2. 傳統Blocking IO,每請求每線程。IO線程做爲生產者,串行接受請求,不斷向隊列中發送消息(任務),線程池做爲消費者,從隊列中接收消息(任務),分配給工做線程處理(執行)。而每一個請求都離不開IO的讀寫阻塞,這也直接致使工做線程跟着阻塞。
  3. 新Netty採用的New IO,一樣是每請求每線程。一樣也是IO線程做爲生產者,線程池做爲消費者。惟一的區別是,相對BIO,每線程的服務時間縮短了。由於在隊列和消費者中間,插入一個輪詢線程Selector,它會不斷去詢問每一個請求,是否讀寫操做準備就緒,只有操做就緒,纔開啓工做線程,從而減小了單個線程的無謂等待時間,提升工做線程的總體執行效率。

線程io模型框架。用來提高線程和io的資源利用率。

netty核心概念是channel和eventloop前者抽象了io模型如tcp http 等,後者抽象了線程資源。

這二者速率是不同的,在一塊兒仺作任務(hanhler)的時候必定有一方會浪費。因而採用異步事件通知的方式 來提升利用綠。


至於nio 非阻塞 網絡框架什麼的,那只是這個核心概念的實現方式之一,用neety徹底能夠作老io和阻塞實現,以機非網絡的本地資源調肚實現 看你昨擴展

學習難肚很小。徹底叄透源碼有難肚

固然是Java高性能網絡編程了,能夠作不少東西,剩下的就是您的想象力了

好比Spring5 、Spark、Cassandra,還有阿里的HSF這些都是基於Netty的。

您能夠購買我翻譯的《Netty實戰》這本書。

如何評價《Netty實戰》這本書? - 知乎

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

netty是tcp/udp層的NIO框架。

你能夠用netty在單臺服務器上實現K級別的併發鏈接,而一樣的事情用傳統的Thread/Select來作就等着機器崩潰吧。

netty的做用是將併發應用中開銷最大的I/O給幹掉了(實現的原理是用boss-worker的模式,本身看源碼),可是業務邏輯代碼的計算量並無,因此原則上你還須要再鏈接若干個線程池來負責後面的功能實現。

學習netty兩本書建議深刻去看,java併發編程實踐和netty實戰。異步只是併發的一個很薄的環節,更多關於數據一致性和鎖的概念須要深刻理解。實際用起來至少得有一個場景,而後實際的模擬一下業務流程,要有數據庫的參與,這樣你才能看到NIO在整個系統當中起到的和沒有起到的做用。

系統須要實現多進程通訊,只有兩種方式:內存共享、消息傳遞;分佈式的系統間通訊只有消息傳遞,Netty可做爲應用間消息傳遞實現的基礎組件,Netty位於OSI協議棧的會話層、表示層、應用層都有涉及,這樣你能夠方便的擴展實現,處理會話層以上的協議和業務;

Netty封裝了java nio的api,使之成爲一個很是方即是用框架;提供了提供處理IO的線程池,最重要的一點保證了一個socket處理在一個線程中完成,一個線程能夠同時處理多個socket,這個比較好玩;

netty等視頻www.it448.com教程

網絡服務均可以考慮用netty來實現
m一下
Java的網絡操做庫,像C++中有ACE同樣的東西。比框架輕兩一些,若是實在要想象不出來的話,就把它當JDBC驅動。

Netty提供異步的、事件驅動的網絡應用程序框架和工具,其實就是一個框架,難度不大,具體的學習能夠加羣523916260,找老師要具體的視頻教程。

但願個人回答能幫助到你!

好比你想寫個tomcat同樣的Server,能夠用netty。

你想寫一個即時通信的應用,能夠用netty。

你想實現一個高性能Rpc框架,能夠用netty。


只要是和網絡有關,基本均可以用netty。
衆多的java一個工具包之一。懂了io模型,沒啥難的。
netty可讓你方便的,高效的,靈活的,處理原始的socket,實現本身的協議;一些難以本身實現的部分,好比tls等,能夠直接套用別人的encoder/decoder。
之前頁遊服務器用mina,如今手遊服務器用netty
簡單歸納可認爲它是NIO框架,封裝衆多協議如tcp/udp。最知名的阿里開源的SOA治理框架dubbo中就是使用Netty。Netty是Mnia做者後又另起新做。學習時,核心要掌握它的線程模型。我使用Netty3.6搭建了公司移動推送服務器使用Netty搭建APP推送服務器 - 博客頻道 - CSDN.NET 推薦閱讀《Netty權威指南》

通訊,我自己也想好好學習一下,如今項目正好須要,看了你的文章講述的很詳細,以前沒有接觸過NIO IO開發,一下看完還須要消化一下。總之謝謝啦,可是文章裏的一些圖片徹底看不見不知道怎麼回事。

netty連個官方混淆指導都沒有,網上也i查不到相關的資料。

相關文章
相關標籤/搜索