天天看點

MIna架構I/O Service層設計

mina從2.0版本以後,它的設計讓人感覺到非常的優雅。它對網絡應用通信架構的3個層進行了更好的抽象,以及在功能邏輯上的劃分,同時又保證了 作為一個網絡應用通信架構的統一。劃分的3個層分别為:

i/o service層

i/o filter chain層

i/o handler層

這裡,我們重點關注i/o service層。作為一個基于網絡通信的應用,無論是伺服器還是用戶端角色,都要和網絡i/o打交道,比如,伺服器端需要建立伺服器端socket,監聽指定端口并等待請求的帶來,而用戶端需要連接配接到伺服器端指定的監聽端口,使用網絡服務。一般來說,這些i/o操作都比較複雜,而且很難在編 碼中進行很好地控制,mina的i/o service層就是處理這些與實際的網絡i/o相關的操作(事件)。

我們先看一下,對于伺服器端和用戶端,i/o service層是如何設計的。類設計上的關系,作為這一層的最頂層抽象就是ioservice接口類,如圖所示:

MIna架構I/O Service層設計

通過上圖,我們可以看到,ioservice抽象的服務(功能)有如下幾個:

管理iosession:建立和删除iosession,探測會話idle狀态

filter chain管理:處理過濾器鍊,允許使用者修改過濾器鍊執行順序

handler的調用:當指定事件發生的時候,負責調用handler進行處理

統計資料管理:更新消息發生的數量,以及傳輸的位元組數,等等

監聽器管理:管理使用者設定的listener

通信管理:管理端到端資料傳輸

具體可以參考源代碼中定義的方法。

下面看看在伺服器端和用戶端,mina是如何使用ioservice進行抽象和設計的。

伺服器端i/o service層

在伺服器端,對應于該層的抽象是ioacceptor接口,ioacceptor繼承自ioservice。具體的類設計上的關系,如圖所示:

MIna架構I/O Service層設計

上圖中,主要基于網絡傳輸層協定tcp和udp内置了對應ioacceptor的實作,還附加了另外兩個,如下所示:

niosocketacceptor

niodatagramacceptor

aprsocketacceptor

vmpipesocketacceptor

根據實作類的命名就可知道各個類對應的應用場景。這裡要說的是,前兩個niosocketacceptor和niodatagramacceptor 都是基于非阻塞socket的。aprsocketacceptor是基于apr(apache portable run-time)的阻塞 socket實作。

用戶端i/o service層

在用戶端,對應于該層的抽象是ioconnector接口,ioconnector繼承自ioservice。具體的類設計上的關系,如圖所示:

MIna架構I/O Service層設計

上圖中給出了ioconnector的6個實作,如下所示:

niosocketconnector

niodatagramconnector

aprsocketconnector

proxyconnector

serialconnector

vmpipeconnector

上面的proxyconnector是提供了代理支援的ioconnector,serialconnector是支援串行傳輸資料的 ioconnector,vmpipeconnector就是in-vm的ioconnector。