【netty】(1)---BIO NIO AIO演變
BIO NIO AIO演變
Netty是一個提供非同步事件驅動的網路應用框架,用以快速開發高效能、高可靠的網路伺服器和客戶端程式。Netty簡化了網路程式的開發,是很多框架和公司都在使用的技術。
Netty並非橫空出世,它是在BIO,NIO,AIO演變中的產物,是一種NIO框架。
一、BIO的理解
網路程式設計的基本模型是Client/Server模型,也就是兩個程序之間進行相互通訊,其中 服務端提供位置資訊(繫結的IP地址和監聽埠),客戶端通過連線操作向服務端監聽的
地址傳送連線請求,通過三次握手建立連線 ,如果連線成功,雙方就可以通過網路套接字(Socket)進行通訊。在基於同步堵塞模式開發中, ServerSocket負責繫結Ip地址,啟動監
聽埠。Socket負責發起連線操作 。連線成功之後,雙方通過輸入和輸出流進行同步堵塞式通訊。
BIO流程圖
BIO全稱Block-IO 是一種 阻塞同步的通訊模式 。我們常說的StockIO一般指的是BIO。是一個比較傳統的通訊方式, 模式簡單,使用方便。但併發處理能力低,通訊耗時,依賴網速 。
BIO 設計原理 :
伺服器通過一個 Acceptor 執行緒負責監聽客戶端請求和為每個客戶端建立一個新的執行緒進行鏈路處理。典型的一請求一應答模式。若客戶端數量增多,頻繁地建立和銷燬執行緒會
給伺服器開啟很大的壓力。後改良為用執行緒池的方式代替新增執行緒,被稱為偽非同步IO。伺服器提供IP地址和監聽的埠,客戶端通過TCP的三次握手與伺服器連線,連線成功後,雙
放才能通過套接字(Stock)通訊。
小結 :BIO模型中通過Socket和ServerSocket完成套接字通道的實現。阻塞,同步,建立連線耗時。
二、NIO的理解
與Socket類和ServerSocket類相對應,NIO也提供了SocketChannel和ServerSocketChannel兩種不同的套接字通道實現。這兩種新增的通道都支援阻塞和非阻塞兩種模
式。阻塞模式使用非常簡單,但是效能和可靠性都不好,非阻塞模式則正好相反。幵發人員一般可以根據自己的需要來選擇合適的模式,一般來說,低負載、低併發的應用程式可
以選擇同步阻塞I/O以降低程式設計父雜度,但是對於高負載、高併發的網路絡應用,需要使用NIO的非堵塞模式迸行幵發。
NIO 全稱New IO,也叫Non-Block IO 是一種 非阻塞同步的通訊模式 。
NIO流程圖
NIO 設計原理
NIO 相對於BIO來說一大進步。客戶端和伺服器之間通過Channel通訊。NIO可以在Channel進行讀寫操作。這些Channel都會被註冊在Selector多路複用器上。Selector通過
一個執行緒不停的輪詢這些Channel。找出已經準備就緒的Channel執行IO操作。NIO 通過一個執行緒輪詢,實現千萬個客戶端的請求,這就是非阻塞NIO的特點。
NIO幾個新概念
1)緩衝區Buffer
它是NIO與BIO的一個重要區別。BIO是將資料直接寫入或讀取到Stream物件中。而NIO的資料操作都是在緩衝區中進行的。緩衝區實際上是一個數組。Buffer最常見的型別
是ByteBuffer,另外還有CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
2)通道Channel
和流不同,通道是雙向的 。NIO可以通過Channel進行資料的讀,寫和同時讀寫操作。通道與流之間不同之處是通道是雙向的,流只能一個方向移動(一個流必須是
InputStream或者OutputStream的子類)。 通道分為兩大類:一類是網路讀寫(SelectableChannel),一類是用於檔案操作(FileChannel),我們使用的SocketChannel
和ServerSocketChannel都是SelectableChannel的子類。
3)多路複用器Selector
NIO程式設計的基礎。多路複用器提供選擇已經就緒的任務的能力。就是Selector會不斷地輪詢註冊在其上的通道(Channel),如果某個通道處於就緒狀態,會被Selector輪詢出
來,然後通過SelectionKey可以取得就緒的Channel集合,從而進行後續的IO操作。伺服器端只要提供一個執行緒負責Selector的輪詢,就可以接入成千上萬個客戶端,這就是
JDK NIO庫的巨大進步。
三、AIO理解
非同步無非是通知系統做一件事情。然後忘掉它,自己做其他事情去了。很多時候系統做完某一件事情後需要一些後續的操作。
AIO 也叫NIO2.0 是一種非阻塞非同步的通訊模式 。在NIO的基礎上引入了新的非同步通道的概念,並提供了非同步檔案通道和非同步套接字通道的實現。
AIO流程圖
AIO 並沒有採用NIO的多路複用器,而是使用非同步通道的概念。其read,write方法的返回型別都是Future物件。而Future模型是非同步的,其核心思想是:去主函式等待時間。
AIO模型中通過 AsynchronousSocketChannel 和 AsynchronousServerSocketChannel 完成套接字通道的實現。非阻塞,非同步。
四、總結
1 IO,NIO,AIO區別
IO 阻塞同步通訊模式,客戶端和伺服器連線需要三次握手,使用簡單,但吞吐量小。
NIO 非阻塞同步通訊模式,客戶端與伺服器通過Channel連線,採用多路複用器輪詢註冊的Channel。提高吞吐量和可靠性。
AIO 非阻塞非同步通訊模式,NIO的升級版,採用非同步通道實現非同步通訊,其read和write方法均是非同步方法。
2 Stock通訊的虛擬碼實現流程
伺服器繫結埠:server = new ServerSocket(PORT)
伺服器阻塞監聽:socket = server.accept()
伺服器開啟執行緒:new Thread(Handle handle)
伺服器讀寫資料:BufferedReader PrintWriter
客戶端繫結IP和PORT:new Socket(IP_ADDRESS, PORT)
客戶端傳輸接收資料:BufferedReader PrintWriter
3 什麼是同步阻塞BIO,同步非阻塞NIO,非同步非阻塞AIO
同步阻塞IO: 使用者程序發起一個IO操作以後,必須等待IO操作的真正完成後,才能繼續執行。
同步非阻塞IO: 使用者程序發起一個IO操作以後,可做其它事情,但使用者程序需要經常詢問IO操作是否完成,這樣造成不必要的CPU資源浪費。
非同步非阻塞IO: 使用者程序發起一個IO操作然後,立即返回,等IO操作真正的完成以後,應用程式會得到IO操作完成的通知。類比Future模式。
4、小結
1)BIO模型中通過Socket和ServerSocket完成套接字通道實現。阻塞,同步,連線耗時。
2) NIO模型中通過SocketChannel和ServerSocketChannel完成套接字通道實現。非阻塞/阻塞,同步,避免TCP建立連線使用三次握手帶來的開銷。
3) AIO模型中通過AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道實現。非阻塞,非同步。
再附上netty權威指南書中一張圖、
五、參考
主要參考一篇文章:BIO NIO AIO演變文章中有這三種類型的程式碼演示。
GitHub地址: ITDragonBlog/daydayup/tree/master/Netty/socket-io" target="_blank" rel="nofollow,noindex">https://github.com/ITDragonBlog/daydayup/tree/master/Netty/socket-io (感謝作者分享)
其它的一些參考:
1、《netty權威指南》第二章
3、 Java I/O模型從BIO到NIO和Reactor模式(圖片解釋更清晰)
如果一個人充滿快樂,正面的思想,那麼好的人事物就會和他共鳴,而且被他吸引過來。同樣,一個人老帶悲傷,倒黴的事情也會跟過來。
——在自己心情低落的時候,告誡自己不要把負能量帶給別人。(大校9)