不畏浮云遮望眼,只緣身在此山中
最近再看dubbo源碼,然后看到通信模塊的netty,卡住了,感覺netty源碼似懂非懂,有些原理根本不知道為什么是這樣,特別是netty中使用到的通信模型,更是云里霧里,所以還是決定從Java中IO開始重新入手,逐漸深入,今天就來(lái)記錄下BIO與NIO模型,主要是看了視頻后的觀后感,視頻地址文末會(huì)分享出來(lái),講的比較好,文章寫的比較簡(jiǎn)單入門,所以要深入,需要自己去研究源碼,當(dāng)然后面自己有更深的心得,也會(huì)分享出來(lái)。如有文中有書寫或其他問題,請(qǐng)留言指導(dǎo)修正,互相交流,共同進(jìn)步,本人QQ:417213902。
主要從以下幾個(gè)方面入手:
- 1、提出一個(gè)疑問:您能描述下一個(gè)http請(qǐng)求嗎?
- 2、通過在tomcat中的使用,對(duì)BIO與NIO模型比較
- 3、BIO與NIO應(yīng)用場(chǎng)景
一、提出疑問
這個(gè)一般大中型公司面試最喜歡的一到題目:
您能描述下一個(gè)http請(qǐng)求嗎?
解答如下,主要從下面兩個(gè)方面闡述
網(wǎng)絡(luò)層,數(shù)據(jù)傳輸層面
網(wǎng)絡(luò)傳輸:TCP、UDP
通信模型:BIO、NIO、AIO-
應(yīng)用層,數(shù)據(jù)處理層面
應(yīng)用協(xié)議:http、rmi 、webservice、redis、jms
序列化協(xié)議:json、
業(yè)務(wù)處理:servlet
從上面可知道,BIO、NIO或者是AIO 是作用于網(wǎng)絡(luò)層的通信模型
image.png
二、BIO與NIO的比較
1、實(shí)踐測(cè)試
由于時(shí)間問題,比較流程大概描述下,后面直接給出結(jié)論,有興趣的小伙伴可以自己去嘗試下。
在tomcat7下分別配置指定AIO和NIO模型, 模擬做http請(qǐng)求,查看在設(shè)定相同的最大請(qǐng)求數(shù)下,隨著請(qǐng)求數(shù)增多,BIO和NIO不同模型下線程數(shù)變化情況。tomcat7 默認(rèn)情況下就是使用BIO模型,配置是在 server.xml里

表示采用BIO

表示采用NIO
測(cè)試結(jié)果 :
BIO :隨著請(qǐng)求數(shù)增多,線程數(shù)也會(huì)增多
NIO : 隨著請(qǐng)求數(shù)增多,線程數(shù)不會(huì)增多
2、理論說(shuō)明
-
(1) BIO : 同步阻塞式模型,在tomcat中它的原理是從客戶端到服務(wù)端在建立連接、寫入、讀取等都是一個(gè)線程處理,所以它是穩(wěn)定的、安全的。它也是實(shí)現(xiàn)中java中的serverSocket,調(diào)用accept方法,這個(gè)accept在有請(qǐng)求時(shí)返回一個(gè)socket,沒有請(qǐng)求時(shí),就阻塞著,但是這里的阻塞并不是導(dǎo)致它就是阻塞模型的原來(lái),其真正原因是網(wǎng)絡(luò)傳輸、業(yè)務(wù)處理等阻塞,阻塞的時(shí)間取決于對(duì)方I/O線程的處理速度和網(wǎng)絡(luò)I/O的傳輸速度。
image.png
在以BIO模型實(shí)現(xiàn)的tomcat中,線程有,
- Acceptor線程 : 不斷調(diào)用 Accept()方法
- Exec線程 : 執(zhí)行調(diào)用業(yè)務(wù)
當(dāng)然以上問題,在tomcat中針對(duì)使用BIO問題,也做了相應(yīng)的優(yōu)化,比如使用線程池,實(shí)現(xiàn)異步阻塞式模型,

- (2) NIO:同步非阻塞式模型,在tomcat7后開始支持NIO模型,tomcat8已經(jīng)開始支持AIO模型了。NIO中之所以能夠支持?jǐn)?shù)萬(wàn)級(jí)別的高并發(fā),其主要原因是它有通道的多路復(fù)用的實(shí)現(xiàn),叫Selector,在nio.channels包下,它負(fù)責(zé)輪詢請(qǐng)求狀態(tài),并封裝在SelectionKey中,通知其他線程去執(zhí)行。
在以NIO模型實(shí)現(xiàn)的tomcat中,線程有,
- ClientPoller 線程:多路復(fù)用器(Selector),輪詢監(jiān)聽四類事件(Connect、Accept、Read、Write),會(huì)通知exec線程 。 tomcat 中默認(rèn)是兩個(gè)線程,可配置
- Acceptor線程 : 不斷調(diào)用 Accept()方法
-
Exec線程 : 執(zhí)行調(diào)用業(yè)務(wù)
image.png
NIO,默認(rèn)也是支持阻塞式 ,configureBlocking(false) 設(shè)置成非阻塞的
三、應(yīng)用場(chǎng)景
- BIO : 適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對(duì)服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡(jiǎn)單易理解,tomcat7之前支持的通信模型
- NIO:適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開始支持,tomcat7開始支持的通信模型
2017-12-03 23:18:00


