netty實戰筆記 第一章 異步和事件驅動 筆記

Netty是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。

Java BIO:
首先,早期我們java裏面使用BIO(Block IO),編寫網絡通信相關的程序時候,往往都是使用Socket編程。會爲每個連接創建一個線程,當連接數少的時候,還可以,但是當連接數多的時候,我們就會發現這很不理想。另外,有些線程會長時間處在休眠狀態,資源浪費。需要爲每個線程的調用棧分配內存. 還有就是頻繁的上下文切換帶來的開銷就會帶來很多麻煩。
Java NIO:
後來在java的1.4版本的時候,出現java.nio.
其中java.nio.channels.Selector是java的非阻塞I/O實現的關鍵。它使用了時間通知API以確定在一組非阻塞Socket中有哪些已經就緒能夠進行I/O的操作。
流經4ChannelHandler鏈的入站事件和出站事件

優點:
使用較少的線程便可以處理許多連接,減少了內存管理和上下文切換帶來的開銷。
當沒有IO操作的時候,線程也可以被用於其他任務。

1.2 異步和事件驅動

可以以任意的順序響應在任意的時間點產生的事件。

一種系統、網絡或者進程在需要處理的工作不斷增長時,可以通過某種可行的方式或者擴大它的處理能力來適應這種增長的能力,對實現最高級別的可伸縮性至關重要。

1.3 netty的核心組件

  • Channel(信道)
  • CallBack(回調)
  • Future
  • 事件和ChannelHandler

這個四個組件代表了不同類型的構造:資源,邏輯以及通知。

1.3.1 Channel

定義

channel代表一個到實體(如一個硬件設備,一個文件,一個網絡套接字,或者一個能夠執行一個或者多個不同的I/O操作的程序組件)的開放連接,如讀操作和寫操作。

目前可以把Channel看作是入站和出站的數據的載體,它可以被打開,關閉,連接,斷開連接。

1.3.2 回調

定義

一個回調就是一個方法,一個指向已經被提供給另一個方法的方法引用。這使得後者可以在適當的時候,調用前者。

1.3.3 Future

Future在java.util.concurrent.Future.Netty提供了自己的實現,ChannelFuture,用於在執行異步操作的時候使用。
每個Netty的出站I/O操作都會返回一個ChannelFuture。也就是說它不會阻塞.

1.3.4 事件和ChannelHandler

Netty使用不同的事件來告訴我們狀態的改變或者操作的狀態。我們可以基於已知的事件來觸發不同的操作。
netty是一個網絡編程框架,所以事件是按照他們與入站或出站數據流的相關性分類的。可能由入站數據或者相關的狀態更改而觸發的事件包括:

  • 連接已被激活或者連接失活
  • 數據讀取
  • 用戶事件
  • 錯誤事件
    出站事件是未來將會觸發的某個動作的操作結果,這些動作包括:
  • 打開或者關閉到遠程節點的連接
  • 將數據寫到或者沖刷到套接字。

每個事件都可以被分發到ChannelHandler類中的某個用戶實現的方法中。
流經4ChannelHandler鏈的入站事件和出站事件

Netty 通過觸發事件將Selector 從應用程序中抽象出來,消除了所有本來將需要手動編寫的派發代碼。在內部,將會爲每個Channel 分配一個EventLoop,用以處理所有事件,包括:

  • 註冊感興趣的事件;
  • 將事件派發給ChannelHandler;
  • 安排進一步的動作。

EventLoop 本身只由一個線程驅動,其處理了一個Channel 的所有I/O 事件,並且在該EventLoop 的整個生命週期內都不會改變。這個簡單而強大的設計消除了你可能有的在ChannelHandler 實現中需要進行同步的任何顧慮,因此,你可以專注於提供正確的邏輯,用來在有感興趣的數據要處理的時候執行。

最後

如果你覺得寫的還不錯,就關注下公衆號唄,關注後,有點小禮物回贈給你。
你可以獲得5000+電子書,java,springCloud,adroid,python等各種視頻教程,IT類經典書籍,各種軟件的安裝及破解教程。
希望一塊學習,一塊進步!
在這裏插入圖片描述

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