大併發量socket 通信框架

學 JAVA 必然要學習網絡通信socket,當我們瞭解了socket的通信原理後,想要寫出一個健壯的socket模塊還是很不容易的,scoket+線程+IO,我們使用最原始的代碼去實現,往往寫出的代碼漏洞百出,那如何是好?今天給大家介紹一個強大的,可以實現大併發量的,scoket通信框架—— MINA。

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它爲開發高性能和高可用性的網絡應用程序提供了非常便利的框架。當前發行的 MINA 版本支持基於 Java NIO 技術的TCP/UDP 應用程序開發、串口通訊程序。

Mina 的應用層:

一個設計成熟的開源框架,總是會僅可能的減少侵入性,並在整個項目中找到合適的位置,而不應對整個項目的構架設計產生過多的影響,圖 1 就是 MINA 的應用層示意圖。從圖中和上節的 DEMO 中我們可以看到, MINA很好的把業務代碼和底層的通信隔離了開來,我們要做的僅僅是建立好監聽,然後寫上我們需要實現的業務邏輯就OK 了。

MINA 的內部流程:

(1) IoService :這個接口在一個線程上負責套接字的建立,擁有自己的 Selector ,監聽是否有連接被建立。

(2) IoProcessor :這個接口在另一個線程上負責檢查是否有數據在通道上讀寫,也就是說它也擁有自己的Selector ,這是與我們使用 JAVA NIO 編碼時的一個不同之處,通常在 JAVA NIO 編碼中,我們都是使用一個 Selector ,也就是不區分 IoService 與 IoProcessor 兩個功能接口。另外, IoProcessor 也是 MINA 框架的核心組件之一 . 在 MINA 框架啓動時,會用一個線程池來專門生成線程,來負責調用註冊在 IoService 上的過濾器,並在過濾器鏈之後調用 IoHandler 。在默認情況 IoProcessor 會用N+1 個線程來輪流詢問監視的端口是否有數據傳送,其中 n 爲 cpu 的內核個數。按一般的多線程設計概念來說,IoProcessor 的線程數是越多越好,但實際上並非如此,因爲大家都知道, IO 的操作是非常佔用資源的,所以項目中的 IoProcessor 的線程數應該根據實際需要來定,而這個數字可以在生成 IoAcceptor 對象時進行設定。 EgIoAcceptor acceptor = new NioSocketAcceptor( N );

(3.) IoFilter :這個接口定義一組攔截器,這些攔截器可以包括日誌輸出、黑名單過濾,甚至是在過濾器鏈中利用 AOP 寫上權限控制。數據的編碼( write 方向)與解碼( read 方向)等功能,其中數據的 encode 與 decode 是最爲重要的、也是您在使用 Mina 時最主要關注的地方。

(4.) IoHandler :這個接口負責編寫業務邏輯,也就是接收、發送數據的地方。如果大家把業務處理寫好,並寫好業務接口,真正要用時,只需要在此處替換即可,再次見證了 MINA 分層的徹底。

其中 IoService 接口會專門起一個線程來輪詢是否有新的連接產生,一旦有連接產生則通知 IoProcessor, 而IoProcessor 則起 n+1 個線程來檢查連接是否有數據在上面讀寫。一旦有連接產生,並有數據讀寫,則通知 decode 或 encode ,進行報文的解碼或編碼,將處理後的報文再交給業務類進行業務處理。其中IoProcessor 是處理請求的分配,包括選擇 Selector ,超時驗證,狀態記錄等。總之這個類和 IoService 一起配合工作,封裝了 NIO 底層的實現以及 MINA 框架內部的功能的支持 .

結合實例,並根據以上的圖文講解,我們可以很輕易的總結出利用 MINA 編程的幾個大致步驟:

創建一個實現了 IoService 接口的類

設置一個實現了 IoFilter 接口的過濾器(如果有需要的情況下)

設置一個 IoHandler 接口實現的處理類,用於處理事件(必須)

對 IoService 綁定一個端口開始工作

注:這一點請特別注意,因 IoProcessor 也是相當於輪詢機制,這導致在報文過長時,或其它原因導致報文不能一次傳輸完畢的情況下,必須保存同一連接 ( 在 MINA 中是以 IoSession 類生成的對象 ) 的上一次狀態,這樣才能截取到一個完成的報文,而這也是 decode( 編碼器 ) 需要做的核心工作 。

文章來至:codexueyuan.com

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