Netty in action ——— 異步和事件驅(qū)動

本文是Netty文集中“Netty in action”系列的文章。主要是對Norman Maurer and Marvin Allen Wolfthal 的 《Netty in action》一書簡要翻譯,同時對重要點加上一些自己補充和擴展。

概要

Netty核心組件

  • Channels —— 通道
  • Callbacks —— 回調(diào)
  • Futures
  • Events and handlers —— 事件和執(zhí)行器

Channels

Channel是基于java NIO結(jié)構(gòu),它表示:
一個打開的到一個實體的連接。實體如,一個計算機硬件驅(qū)動、一個文件、一個網(wǎng)絡(luò)socket、或者一個有能力處理一個或多個I/O操作(比如,讀/寫功能)的程序組件。
可以將Channel想象成一個運輸工具,用于輸入和輸出數(shù)據(jù)。同樣地,Channel能被open、close、connected、disconnected

Callbacks

回調(diào)是在一個適當(dāng)?shù)臅r間被調(diào)用的,回調(diào)是一個最常見的方法之一用于通知一個感興趣的操作已經(jīng)完成。
Netty使用一個內(nèi)部的回調(diào)處理事件;當(dāng)一個回調(diào)被觸發(fā)時事件能被一個實現(xiàn)channelHandler 接口的實例處理。

Futures

Future提供了另一個方式去通知應(yīng)用當(dāng)一個操作已經(jīng)完成。Future對象作為一個異步操作結(jié)果的占位符返回,異步操作將在未來的某個時刻完成并提供一個可訪問的結(jié)果。
JDK提供了 interface java.util.concurrent.Future,但JDK對Future的實現(xiàn)需要你手動檢查是否一個操作已經(jīng)完成或者堵塞直到操作完成。這很笨重的,所以Netty提供了它自己的實現(xiàn) ———— ChannelFuture,用于一個異步操作執(zhí)行時。

ChannelFuture提供了一個附加的方法,這個方法允許你注冊一個或多個ChannelFutureListenner實例?!皁perationComplete()”在操作完成時會被回調(diào)。監(jiān)聽者能夠確定操作是否成功或失敗。如果失敗了,我們能夠恢復(fù)錯誤。簡而言之,ChannelFutureListener的通知機制消除了手動檢查操作完成的需要。
ChannelFutureListenner 將 future 和 callback 組合起來了。

Netty的出站I/O操作將返回一個ChannelFuture:

Events and handlers

Netty使用不同的事件來通知我們關(guān)于狀態(tài)的變化或者操作的狀態(tài)。這允許我們基于事件的發(fā)生觸發(fā)適當(dāng)?shù)牟僮鳌?br> Netty將事件劃分為“入站數(shù)據(jù)流”或“出站數(shù)據(jù)流”
入站操作或者一個相關(guān)的狀態(tài)變化包括:

  • 連接狀態(tài)的活躍(active)或不活躍(inactive)
  • 數(shù)據(jù)的讀取
  • 用戶事件觸發(fā)
  • 錯誤事件觸發(fā)

一個出站事件是一個Future中動作的結(jié)果。出站事件比如:

  • 開啟或關(guān)閉一個遠(yuǎn)端連接
  • 寫或刷新數(shù)據(jù)到套接字中

每個事件能被分配到一個用戶實現(xiàn)的一個處理類的方法中。目前你可以認(rèn)為每一個handler的實例都是一個callback的類型,用于執(zhí)行一個特定事件的返回。
Netty提供了一個可擴展的預(yù)定義處理器集合使你能夠拆箱即用,包括如HTTP、SSL/TLS協(xié)議的處理。

SELECTORS,EVENTS,AND EVENT LOOPS

Netty通過觸發(fā)事件將Selector從應(yīng)用中提取了出來。一個EventLoop被分配給每個Channel用于處理這個Channel的所有事件。
EventLoop本身由一個線程驅(qū)動,該線程處理一個Channel的所以I/O事件,并且在整個EventLoop的生命周期都不會改變持有的線程。

后記

本文主要是對Netty的部分核心組件做了一個簡單的介紹。各個組件和模塊會在后續(xù)的文章中進(jìn)行詳細(xì)的介紹。
若文章有任何錯誤,望大家不吝指教:)

參考

《Netty in action》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容