首頁>Club>
7
回覆列表
  • 1 # 此生唯一

    上一個問答說到了多執行緒為什麼不適合長連線的問題,因為建立多個執行緒用於維持連線,會極大的浪費記憶體資源,彷彿一個個執行緒被阻塞了一樣!

    正好這個時候,jdk4提出了一套新的類庫NIO:noneBlocking IO(當然,也有人叫做new IO,用於區別原來老式IO處理方式),同步非阻塞IO,Netty正是基於NIO做的一套同步非阻塞框架,netty效能良好,而且封裝了一套原本在NIO中複雜的API,提供給操作者方便的呼叫!

    阻塞與非阻塞:原本的多個執行緒分別處理連線,不管資料有沒有傳輸,執行緒一直存在,而沒有進行讀寫資料的時候就相當於發生了阻塞!而非阻塞模型是使用一個執行緒幹了所有執行緒的活,透過不斷的輪詢看連線需不需要進行資料讀寫,如果不需要就略過,如果需要就交給另外一套專門處理任務的執行緒池進行處理,這樣維持連線的執行緒從原來的多個連線變為了一個,永遠沒有執行緒是阻塞的!

    netty就是基於這樣的非同步事件驅動,非阻塞模型開發的NIO框架,基於reactor模型,能在單個執行緒接受到請求之後採取多路複用的方式把請求轉交給任務處理執行緒池進行處理!reactor模型也有多種:單執行緒模型,多執行緒模型和主從多執行緒模型!

    事實上,大多數的高效能框架都是基於reactor模型進行設計,包括nginx,redis都有類似的技術模型!阿里的SOFAbolt,Ratpack等等非常多的RPC框架,伺服器等都是基於netty進行開發,可以說在高併發的環境下,netty是搭建多工長連線處理模型的不二之選!

    關於netty知識,有大量的書籍介紹!不是短短的幾百字就可以說的清的,可以自己動手實現相應的東西才能加深理解,更多的技術分享,敬請關注。。。

  • 2 # 被追趕的光頭強

    1、netty為一個IO協議的非同步事件機制的框架,亦稱為NIO

    2、適合高併發TCP層協議開發

    3、做通訊或者遊戲伺服器常用到

    4、有些系統架構伺服器通訊也使用,比如dubbo

  • 3 # 二十四層小爺

    netty,是網路程式設計框架。想了解netty是什麼,能做什麼,不如先了解為什麼會出現netty。

    首先要理解網路程式設計,百科上面有,太抽象,狹義上講,網路程式設計主要指socket程式設計。那什麼是socket?瞭解下五元組,什麼是五元組?一個通俗也許不準確的解釋是網路通訊的兩端中的任何一端都是一個socket,類似一個class,裡面定義了五個屬性(Src IP+src port+dst ip+dst port + Protocol)和若干個方法(bind、listen、accept、read、write)。

    看到上面的五元組和若干個socket介面方法,大家可能會知道,這就是我們最原始的網路程式設計的幾個方法。那如果真的讓你用這幾個方法寫個聊天工具,相信這是大學課程,大家應該都會,不會就找找資料,如果還看不懂就別看了。

    如果你真的用bind、listen、accept、read、write五個方法寫了個網路程式,那麼你仔細看看一定會發現一個問題——阻塞。這個阻塞的意思是,要麼是有個執行緒阻塞在accept上,要麼是有個執行緒阻塞在read上。如果想同時處理多個客戶端的連線,就得每個連線一個執行緒等著read,就必須多執行緒了。

    用了多執行緒,你的程式可以處理多個連線了,新的問題來了,由於是一個連線一個執行緒,如果一臺機器同時有1w個人訪問,是不是要有1w個執行緒,如果這一萬個執行緒都是活動的,那CPU就被玩兒死了。這個時候大家就想啊,總是這麼阻塞不是個事兒,linux的大神們就嘩嘩出解決方案,select、poll、epoll的解決方案都出來了。他們出來後,調的就不是上面說的那幾個方法了,而是其他的一些介面方法。能夠讓你的程式支援了單機10萬併發,解決了C10K的問題。

    好,說完了上面的歷史,你就會發現,讓你寫個網路程式設計的程式,真他麼麻煩,你又要考慮管理建立的連線、又要管理處理執行緒,寫一大堆的socket的呼叫程式碼,這玩意其實是可以抽象的。netty首先就做了這麼個事兒,他幫你解決了建立socket,管理socket等等工作,幫你把同步變成了非同步。還有零複製的實現啊、epoll的實現啊。讓你可以比較輕鬆的寫一個單機十萬併發的程式。總的來說,netty是網路程式設計的一個框架,解決了我們寫網路程式設計時呼叫socket方法的那些事兒,面向你的就是有連線新建了、有新包進來了、網路斷開了,有包發走了等等。

  • 中秋節和大豐收的關聯?
  • 嬰兒撫觸有哪些好處?