Netty概述Netty是一個高性能、異步事件驅(qū)動的NIO框架,它提供了對TCP、UDP和文件傳輸?shù)闹С?。作為當前最流行的NIO框架,Netty在互聯(lián)網(wǎng)領域、大數(shù)據(jù)分布式計算領域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應用,一些業(yè)界著名的開源組件也基于Netty的NIO框架構(gòu)建。 Netty 利用 Java 高級網(wǎng)絡的能力,隱藏其背后的復雜性而提供一個易于使用的 API 構(gòu)建一個客戶端/服務端,其具有高并發(fā)、傳輸快、封裝好等特點。 高并發(fā) Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)開發(fā)的網(wǎng)絡通信框架,對比于BIO(Blocking I/O,阻塞IO),他的并發(fā)性能得到了很大提高 。 傳輸快 Netty的傳輸快其實也是依賴了NIO的一個特性——零拷貝。 封裝好 Netty封裝了NIO操作的很多細節(jié),提供易于使用的API,還有心跳、重連機制、拆包粘包方案等特性,使開發(fā)者能能夠快速高效的構(gòu)建一個穩(wěn)健的高并發(fā)應用。 image Netty框架Netty項目致力于提供一個異步的、事件驅(qū)動的網(wǎng)絡應用框架和工具,用于快速開發(fā)可維護的、高性能的、高擴展性的服務器和客戶端之間的協(xié)議。換句話說,Netty式一個NIO客戶端服務器框架,能夠快速、輕松地開發(fā)網(wǎng)絡應用例如服務器和客戶端間的協(xié)議。它簡化了網(wǎng)絡編程如TCP/IP socket服務器。 JBOSSes Netty的設計吸取了大量的協(xié)議如FTP、SMTP、HTTP和各種二進制、基于文本的繼承協(xié)議等協(xié)議的設計經(jīng)驗,成功地找到了一種方法實現(xiàn)易于開發(fā)、性能、穩(wěn)定、靈活的協(xié)議開發(fā)。 特征: Netty為用戶提供了很多創(chuàng)新和更好的網(wǎng)絡開發(fā)體驗。 1)設計Design 為各種傳輸類型(塊和非塊socket)提供了統(tǒng)一的API; 建立在靈活和可擴展的事件模型; 高度可定制的線程模式——單線程,一個或多個線程池(如SEDA); 可信的五連接數(shù)據(jù)報socket支持。 2)易于使用 良好文檔化的Javadoc、用戶向?qū)Ш屠樱?/p> 結(jié)構(gòu)并不臃腫; 無其它的依賴,只需JDK1.5或以上。 3)性能 高吞吐量、低延遲時間; 很小的資源消耗; 最小化不必要的內(nèi)存復制。 4)健壯性 不會因為快速連接、慢速連接或超載連接引起OutOfMemoryError錯誤; 高速網(wǎng)絡下不會引起NIO程序的讀寫異常。 5)安全 完全支持SSL/TLS和StartTLS; 在Java Applet環(huán)境下運行正常。 6)社區(qū) 至少每兩周一個版本發(fā)布。 項目主頁:?http://www./netty/ 文檔地址:?http://www./netty/documentation.html 下載地址:?http://www./netty/downloads.html 為什么選擇NettySocket通信(IO/NIO/AIO)編程,對于通信模型已經(jīng)有了一個基本的認識。我們學習的僅僅是一個模型,如果想把這些真正的用于實際工作中,那么還需要不斷的完善、擴展和優(yōu)化。比如經(jīng)典的TCP讀包寫包問題,或者是數(shù)據(jù)接收的大小,實際的通信處理與應答的處理邏輯等等一些細節(jié)問題需要認真的去思考,而這些都需要大量的時間和經(jīng)歷,以及豐富的經(jīng)驗。所以想學好Socket通信不是件容易事,那么接下來就來學習一下新的技術Netty,為什么會選擇Netty?因為它簡單!使用Netty不必編寫復雜的邏輯代碼去實現(xiàn)通信,再也不需要去考慮性能問題,不需要考慮編碼問題,半包讀寫等問題。強大的Netty已經(jīng)幫我們實現(xiàn)好了,我們只需要使用即可。 Netty是最流行的NIO框架,它的健壯性、功能、性能、可定制性和可擴展性在同類框架都是首屈一指的。它已經(jīng)得到成百上千的商業(yè)/商用項目驗證,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbox等等。 image Netty的線程模型并發(fā)系統(tǒng)可以采用多種并發(fā)編程模型來實現(xiàn)。并發(fā)模型指定了系統(tǒng)中的線程如何通過協(xié)作來完成分配給它們的作業(yè)。不同的并發(fā)模型采用不同的方式拆分作業(yè),同時線程間的協(xié)作和交互方式也不相同。 對于網(wǎng)絡請求一般可以分為兩個處理階段,一是接收請求任務,二是處理網(wǎng)絡請求。根據(jù)不同階段處理方式分為以下幾種線程模型: 串行化處理模型 這個模型中用一個線程來處理網(wǎng)絡請求連接和任務處理,當worker接受到一個任務之后,就立刻進行處理,也就是說任務接受和任務處理是在同一個worker線程中進行的,沒有進行區(qū)分。這樣做存在一個很大的問題是,必須要等待某個task處理完成之后,才能接受處理下一個task。 而通常情況下,任務的處理過程會比任務的接受流程慢得多。例如在處理任務的時候,我們可能會需要訪問遠程數(shù)據(jù)庫,這屬于一種網(wǎng)絡IO。通常情況下IO操作是比較耗時的,這直接影響了下一個任務的接受,而且通常在IO操作的時候,CPU是比較空閑的,白白浪費了資源。 因此可以把接收任務和處理任務兩個階段分開處理,一個線程接收任務,放入任務隊列,另外的線程異步處理任務隊列中的任務。 并行化處理模型 由于任務處理一般比較緩慢,會導致任務隊列中任務積壓長時間得不到處理,這時可以使用多線程來處理。這里使用的是一個公共的任務隊列,多線程環(huán)境中不免要通過加鎖來保證線程安全,我們常用的線程池就是這種模式??梢酝ㄟ^為每個線程維護一個任務隊列來改進這種模型。 Reactor線程模型 reactor線程模型關注的是:任務接受之后,對處理過程繼續(xù)進行切分,劃分為多個不同的步驟,每個步驟用不同的線程來處理,也就是原本由一個線程處理的任務現(xiàn)在由多個線程來處理,每個線程在處理完自己的步驟之后,還需要將任務轉(zhuǎn)發(fā)到下階段線程繼續(xù)進行處理。 Netty的Reactor線程模型其中mainReacotor,subReactor,Thread Pool是三個線程池。mainReactor負責處理客戶端的連接請求,并將accept的連接注冊到subReactor的其中一個線程上;subReactor負責處理客戶端通道上的數(shù)據(jù)讀寫;Thread Pool是具體的業(yè)務邏輯線程池,處理具體業(yè)務。 Netty具體線程模型 如何理解NioEventLoop和NioEventLoopGroup 1)NioEventLoop實際上就是工作線程,可以直接理解為一個線程。NioEventLoopGroup是一個線程池,線程池中的線程就是NioEventLoop。 2)實際上bossGroup中有多個NioEventLoop線程,每個NioEventLoop綁定一個端口,也就是說,如果程序只需要監(jiān)聽1個端口的話,bossGroup里面只需要有一個NioEventLoop線程就行了。 每個NioEventLoop都綁定了一個Selector,所以在Netty的線程模型中,是由多個Selecotr在監(jiān)聽IO就緒事件。而Channel注冊到Selector。 一個Channel綁定一個NioEventLoop,相當于一個連接綁定一個線程,這個連接所有的ChannelHandler都是在一個線程中執(zhí)行的,避免了多線程干擾。更重要的是ChannelPipline鏈表必須嚴格按照順序執(zhí)行的。單線程的設計能夠保證ChannelHandler的順序執(zhí)行。 一個NioEventLoop的selector可以被多個Channel注冊,也就是說多個Channel共享一個EventLoop。EventLoop的Selecctor對這些Channel進行檢查。
小編準備了關于netty的面試題分享給大家,由于文章篇幅原因以下只分享10道netty的面試題。后五道題未設置答案,需要獲取答案和更多Java架構(gòu)資料、面試題(含答案)和面試心得以及視頻資料的可以加入Java貓的架構(gòu)學習基地:810589193獲??! netty面試題1.BIO、NIO和AIO的區(qū)別?
2.NIO的組成?
3.Netty的特點?
4.Netty的線程模型?
5.TCP 粘包/拆包的原因及解決方法?
6.了解哪幾種序列化協(xié)議? 7.如何選擇序列化協(xié)議? 8.Netty的零拷貝實現(xiàn)? 9.Netty的高性能表現(xiàn)在哪些方面? 10.NIOEventLoopGroup源碼? 如果你想突破自己的天花板,那一定要比別人付出更多,這個過程是很辛苦的。如果你認準了一條路,堅持走下去,你一定會獲得很多收獲和你滿意的答案。 最后,希望以上的分享能給大家?guī)硎斋@。更多面試題領取方式加入Java貓的架構(gòu)學習基地:810589193免費獲?。。?! |
|
|