掌握Netty,面試怎么回答Netty?
點(diǎn)擊上方?泥瓦匠?輕松關(guān)注!
本文來(lái)源:http://8rr.co/uBVt
Netty是什么
Netty 是一款異步的事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架,支持快速地開發(fā)可維護(hù)的高性能的面向協(xié)議的服務(wù)器和客戶端。
異步和同步
同步(Sync):所謂同步,就是線程發(fā)出一個(gè)功能調(diào)用時(shí),在沒(méi)有得到結(jié)果之前,該調(diào)用就不返回或繼續(xù)執(zhí)行后續(xù)操作,而是等待可以調(diào)用。當(dāng)可以調(diào)用之后,線程自行進(jìn)行調(diào)用。
異步(Async):異步與同步相對(duì),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者在沒(méi)有得到結(jié)果之前,就可以繼續(xù)執(zhí)行后續(xù)操作。當(dāng)這個(gè)調(diào)用完成后,一般通過(guò)狀態(tài)、通知和回調(diào)來(lái)通知調(diào)用者。對(duì)于異步調(diào)用,調(diào)用的返回并不受調(diào)用者控制。
總結(jié)來(lái)說(shuō),同步和異步的區(qū)別大概有兩個(gè):
請(qǐng)求發(fā)出后,是否可以返回執(zhí)行其他操作。 當(dāng)可以進(jìn)行調(diào)用時(shí),同步情況是發(fā)起調(diào)用的線程自己去調(diào)用并得到結(jié)果,異步情況是內(nèi)核將調(diào)用動(dòng)作完成,將結(jié)果返回給調(diào)用線程。
事件驅(qū)動(dòng)
一個(gè)典型的事件驅(qū)動(dòng)的程序,就是一個(gè)死循環(huán),并以一個(gè)線程的形式存在,這個(gè)死循環(huán)包括兩個(gè)部分,第一個(gè)部分是按照一定的條件接收并選擇一個(gè)要處理的事件,第二個(gè)部分就是事件的處理過(guò)程。程序的執(zhí)行過(guò)程就是選擇事件和處理事件,而當(dāng)沒(méi)有任何事件觸發(fā)時(shí),程序會(huì)因查詢事件隊(duì)列失敗而進(jìn)入睡眠狀態(tài),從而釋放cpu。
也就是說(shuō),事件驅(qū)動(dòng)就是有事件就處理,沒(méi)時(shí)間就等待。
BIO、NIO和AIO的區(qū)別
事件分離器
在IO讀寫時(shí),把 IO請(qǐng)求 與 讀寫操作 分離調(diào)配進(jìn)行,需要用到事件分離器。根據(jù)處理機(jī)制的不同,事件分離器又分為:同步的Reactor和異步的Proactor。
Reactor模型:
應(yīng)用程序在事件分離器注冊(cè) 讀就緒事件 和 讀就緒事件處理器 事件分離器等待讀就緒事件發(fā)生 讀就緒事件發(fā)生,激活事件分離器,分離器調(diào)用 讀就緒事件處理器(即:可以進(jìn)行讀操作了,開始讀) 讀事件處理器開始進(jìn)行讀操作,把讀到的數(shù)據(jù)提供給程序使用
Proactor模型:
應(yīng)用程序在事件分離器注冊(cè) 讀完成事件 和讀完成事件處理器,并向操作系統(tǒng)發(fā)出異步讀請(qǐng)求 事件分離器等待操作系統(tǒng)完成讀取 在分離器等待過(guò)程中,操作系統(tǒng)利用并行的內(nèi)核線程執(zhí)行實(shí)際的讀操作,并將結(jié)果數(shù)據(jù)存入用戶自定義緩沖區(qū),最后通知事件分離器讀操作完成 事件分離器監(jiān)聽到 讀完成事件 后,激活 讀完成事件的處理器 讀完成事件處理器 處理用戶自定義緩沖區(qū)中的數(shù)據(jù)給應(yīng)用程序使用
同步和異步的區(qū)別就在于 讀 操作由誰(shuí)完成:同步的Reactor是指程序發(fā)出讀請(qǐng)求后,由分離器監(jiān)聽到可以進(jìn)行讀操作時(shí)(需要獲得讀操作條件)通知事件處理器進(jìn)行讀操作,異步的Proactor是指程序發(fā)出讀請(qǐng)求后,操作系統(tǒng)立刻異步地進(jìn)行讀操作了,讀完之后在通知分離器,分離器激活處理器直接取用已讀到的數(shù)據(jù)。
同步阻塞IO(BIO):在此種方式下,用戶進(jìn)程在發(fā)起一個(gè)IO操作以后,必須等待IO操作的完成,只有當(dāng)真正完成了IO操作以后,用戶進(jìn)程才能運(yùn)行。JAVA傳統(tǒng)的IO模型屬于此種方式!
同步非阻塞IO(NIO):在此種方式下,用戶進(jìn)程發(fā)起一個(gè)IO操作以后邊可返回做其它事情,但是用戶進(jìn)程需要時(shí)不時(shí)的詢問(wèn)IO操作是否就緒,這就要求用戶進(jìn)程不停的去詢問(wèn),從而引入不必要的CPU資源浪費(fèi)。其中目前JAVA的NIO就屬于同步非阻塞IO。
異步阻塞IO(AIO):此種方式下是指應(yīng)用發(fā)起一個(gè)IO操作以后,不等待內(nèi)核IO操作的完成,等內(nèi)核完成IO操作以后會(huì)通知應(yīng)用程序,這其實(shí)就是同步和異步最關(guān)鍵的區(qū)別,同步必須等待或者主動(dòng)的去詢問(wèn)IO是否完成,那么為什么說(shuō)是阻塞的呢?因?yàn)榇藭r(shí)是通過(guò)select系統(tǒng)調(diào)用來(lái)完成的,而select函數(shù)本身的實(shí)現(xiàn)方式是阻塞的,而采用select函數(shù)有個(gè)好處就是它可以同時(shí)監(jiān)聽多個(gè)文件句柄,從而提高系統(tǒng)的并發(fā)性!
異步非阻塞IO:在此種模式下,用戶進(jìn)程只需要發(fā)起一個(gè)IO操作然后立即返回,等IO操作真正的完成以后,應(yīng)用程序會(huì)得到IO操作完成的通知,此時(shí)用戶進(jìn)程只需要對(duì)數(shù)據(jù)進(jìn)行處理就好了,不需要進(jìn)行實(shí)際的IO讀寫操作,因?yàn)檎嬲腎O讀取或者寫入操作已經(jīng)由內(nèi)核完成了。目前Java中還沒(méi)有支持此種IO模型。
Netty相關(guān)概念和基本架構(gòu)
Netty的核心組件包括以下幾個(gè)部分:
BootStrap和ServerBootstrap BootStrap通常稱為引導(dǎo)類,提供一個(gè)用于應(yīng)用程序網(wǎng)絡(luò)層配置的容器。 Channel 底層網(wǎng)路傳輸API必須提供給應(yīng)用I/O操作的接口,如讀、寫、連接、綁定等。它結(jié)構(gòu)類似一個(gè)“Socket”。它有很多類似于socket的函數(shù):bind、close、config、connect、isActive、isOpen、isWritable、read、write等等。 ChannelHandler Handle稱之為處理器,支持很多協(xié)議,提供用于數(shù)據(jù)處理的容器。常用的一個(gè)接口是ChannelInboundHandler,這個(gè)類型可以處理入站事件(即外部應(yīng)用連接到本應(yīng)用的事件);反之有ChannelOutboundHandler接口,處理出站事件。業(yè)務(wù)邏輯經(jīng)常在一個(gè)或多個(gè)ChannelInboundHandler中操作。 ChannelPipeline Netty的數(shù)據(jù)處理流程其實(shí)是一種責(zé)任鏈和攔截過(guò)濾器模式,ChannelPipeline 提供了一個(gè)鏈容器,該鏈包含一個(gè)或多個(gè)ChannelHandler ,并提供了一個(gè)API用于管理沿著鏈入站和出站事件的流動(dòng)。 EventLoop EventLoop 用于處理 Channel 的 I/O操作。一個(gè)EventLoop可以處理多個(gè)Channel事件。而EventLoopGroup是一個(gè)Group,可以包括多個(gè)EventLoop。 ChannelFuture Netty是一種異步I/O模型,一個(gè)操作可能無(wú)法立即返回結(jié)果,所以它提供了ChannelFuture類,可以通過(guò)addListener添加監(jiān)聽器,操作完成時(shí)可以作出通知。
Netty的基本架構(gòu)如下圖所示:

參考:
【面試題】Netty相關(guān)
為什么Netty受歡迎?
Netty入門教程2——?jiǎng)邮执罱℉ttpServer
BIO、NIO和AIO的區(qū)別(簡(jiǎn)明版)
reactor和proactor模式
基本概念_同步、異步有什么區(qū)別
事件驅(qū)動(dòng)機(jī)制跟消息驅(qū)動(dòng)機(jī)制相比
Netty學(xué)習(xí)筆記之三——認(rèn)識(shí)Netty架構(gòu)
Netty4詳解三:Netty架構(gòu)設(shè)計(jì)Netty整體架構(gòu)

﹀
﹀
﹀
下方二維碼關(guān)注我

互聯(lián)網(wǎng)草根,堅(jiān)持分享技術(shù)、創(chuàng)業(yè)、產(chǎn)品等心得和總結(jié)~

點(diǎn)擊“閱讀原文”,領(lǐng)取 2020 年最新免費(fèi)技術(shù)資料大全



