Netty:Netty基礎知識

1、Netty簡介

(1)相關概念

Netty 是由 JBOSS 提供的一個 Java 開源框架,現爲 Github 上的獨立項目。
Netty 是一個異步的、基於事件驅動的網絡應用框架(根據客戶端的行爲來確定),用以快速開發高性能、高可靠性的網絡 IO 程序。
Netty 主要針對在 TCP 協議下,面向 Client 端的高併發應用,或者 Peer-to-Peer 場景下的大量數據持續傳輸的應用。
Netty 本質是一個 NIO 框架,適用於服務器通訊相關的多種應用場景。
要透徹理解 Netty,需要先學習 NIO,這樣我們才能閱讀 Netty 的源碼。

 

 

(2)IO模型

I/O 模型就是用什麼樣的通道進行數據的發送和接收,很大程度上決定了程序通信的性能。Java 共支持 3 種網絡編程模型 I/O 模式:BIO、NIO、AIO。
  BIO:同步並阻塞,其相關的類和接口在 java.io。服務器實現模式爲一個連接創建一個線程(創建的線程過多服務器的壓力會增大),即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷(一個連接並不是時時刻刻都在讀寫數據)。適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4 以前的唯一選擇,但程序簡單易理解。

  之所以是阻塞式IO,是因爲服務端在監聽客戶端,和接收客戶端時,是阻塞的狀態。

 

 

  NIO:同步非阻塞,服務器實現模式爲一個線程處理多個連接,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有 I/O 請求就進行處理。適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,彈幕系統,服務器間通訊等。編程比較複雜,JDK1.4 開始支持。

  NIO是非阻塞的原因是,如果某一個通道沒有數據的讀取,線程就不會對該通道進行處理,該線程不會阻塞。

 

 

AIO:異步非阻塞,AIO 引入異步通道的概念,採用了 Proactor 模式,簡化了程序編寫,有效的請求才啓動線程,它的特點是先由操作系統完成後才通知服務端程序啓動線程去處理,一般適用於連接數較多且連接時間較長的應用。適用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用 OS 參與併發操作,編程比較複雜,JDK7 開始支持。

 

2、NIO

(1)相關概念

  • Java NIO 全稱 Java non-blocking IO,是指 JDK 提供的新 API。從 JDK1.4 開始,Java 提供了一系列改進的輸入/輸出的新特性,被統稱爲 NIO(即 NewIO),是同步非阻塞的。
  • NIO 相關類都被放在 java.nio 包及子包下,並且對原 java.io 包中的很多類進行改寫。【基本案例】
  • NIO 有三大核心部分:Channel(通道)、Buffer(緩衝區)、Selector(選擇器) 。
  • NIO 是面向緩衝區,或者面向塊編程的。數據讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞式的高伸縮性網絡。
  • Java NIO 的非阻塞模式,使一個線程從某通道發送請求或者讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麼都不會獲取,而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。非阻塞寫也是如此,一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。
  • 通俗理解:NIO 是可以做到用一個線程來處理多個操作的。假設有 10000 個請求過來,根據實際情況,可以分配 50 或者 100 個線程來處理。不像之前的阻塞 IO 那樣,非得分配 10000 個。
  • HTTP 2.0 使用了多路複用的技術,做到同一個連接併發處理多個請求,而且併發請求的數量比 HTTP 1.1 大了好幾個數量級。

(2)BIO與NIO的比較

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章