天天看點

高性能Java網絡架構 MINA

高性能Java網絡架構 MINA

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它為開發高性能和高可用性的網絡應用程式提供了非常便利的架構。目前發行的 MINA 版本支援基于 Java NIO 技術的 TCP/UDP 應用程式開發、序列槽通訊程式(隻在最新的預覽版中提供),MINA 所支援的功能也在進一步的擴充中。

簡介

      Apache MINA是一個網絡應用程式架構,用來幫助使用者簡單地開發高性能和高可靠性的網絡應用程式。它提供了一個通過Java NIO在不同的傳輸例如TCP/IP和UDP/IP上抽象的事件驅動的異步API。

MINA雖然簡單但是仍然提供了全功能的網絡應用程式架構:

● 為不同的傳輸類型提供了統一的API:

○ 通過Java NIO提供TCP/IP 和 UDP/IP支援

○ 通過RXTX提供序列槽通訊(RS232)

○ In-VM管道通訊

○ 你能實作你自己的API!

● 過濾器作為一個擴充特性; 類似Servlet過濾器

● 低級和進階的API:

○ 低級: 使用位元組緩存(ByteBuffers)

○ 進階: 使用使用者定義的消息對象(objects)和編碼(codecs)

● 高度定制化線程模型:

○ 單線程

○ 一個線程池

○ 一個以上的線程池(也就是SEDA)

● 使用Java 5 SSL引擎提供沙盒(Out-of-the-box) SSL · TLS · StartTLS支援

● 超載保護和傳輸流量控制

● 利用模拟對象進行單元測試

● JMX管理能力

● 通過StreamIoHandler提供基于流的I/O支援

● 和知名的容器(例如PicoContainer、Spring)內建

● 從Netty平滑的遷移到MINA, Netty是MINA的前輩。

MINA版本

Mina 的 API 目前主要有三個分支,分别是:

2.0.x 目前處于 SVN trunk 上的版本, Mina 社群對該版本的 API 進行了全新的設計

1.1.x 為目前用于産品開發的版本,适用于 5.0 以上的 JDK ,最新版本為 1.1.5

1.0.x 是 1.1.x 的 JDK 1.4 的相容版本,最新版本為 1.0.8

這裡将要介紹的是 2.0.x 版。雖然目前的穩定版本還是 1.1.x ,但是按照 Mina 團隊之前的開發計劃, 2.0.x 即将在 08 年夏季正式釋出,并且在 2.0.x 中對 Spring 等 IoC 的內建進行了簡化,添加了基于 OGNL 的 JMX 遠端管理支援,使用基于 Java Annotation 的全新 API 大大簡化了狀态機程式設計,新的基于 Apache APR 的基礎 I/O 元件促進了進一步的效率提升(據官方評測, APR 的效率較之 Sun NIO 要高出約 10%)。由于這一系列的重大改進,使得 2.0.x 成為十分令人期待的一個版本,無論是 Mina 新手還是老使用者,如果你對這個項目抱有興趣,便很有必要提前對這個版本進行一些了解。

首先讓我們對異步 I/O 做一些基本的了解。異步 I/O 模型大體上可以分為兩種,反應式( Reactive )模型和前攝式( Proactive )模型:

傳統的 select / epoll / kqueue 模型,以及 Java NIO 模型,都是典型的反應式模型,即應用代碼對 I/O 描述符進行注冊,然後等待 I/O 事件。當某個或某些 I/O 描述符所對應的 I/O 裝置上産生 I/O 事件(可讀、可寫、異常等)時,系統将發出通知,于是應用便有機會進行 I/O 操作并避免阻塞。由于在反應式模型中應用代碼需要根據相應的事件類型采取不同的動作,最常見的結構便是嵌套的 if {...} else {...}  或 switch ,并常常需要結合狀态機來完成複雜的邏輯。

前攝式模型則恰恰相反。在前攝式模型中,應用代碼主動地投遞異步操作而不管 I/O 裝置目前是否可讀或可寫。投遞的異步 I/O 操作被系統接管,應用代碼也并不阻塞在該操作上,而是指定一個回調函數并繼續自己的應用邏輯。當該異步操作完成時,系統将發起通知并調用應用代碼指定的回調函數。在前攝式模型中,程式邏輯由各個回調函數串聯起來:異步操作 A 的回調發起異步操作 B ,B 的回調再發起異步操作 C ,以此往複。

Reactor 和 Proactor 同為事件驅動 I/O 模型,其本質差別在于事件觸發時機: Reactor 在 I/O 裝置就緒,即可以立即執行 I/O 調用而無需阻塞時觸發,隻有這時才可以放心大膽的執行 I/O 調用;而 Proactor 則允許在任意時刻發起 I/O 調用請求,并在 I/O 調用完成時觸發事件。

Proactor 可以直接利用系統提供的 aio 、 IOCP 等異步 I/O 機制實作。不過鑒于一時之間各種平台上 aio 接口實作的相容性、功能、性能等方面的表現都還比較不靠譜,常見平台裡還是 Win32 IOCP 對 Proactor 的原生支援最好。當系統不提供原生的異步 I/O 機制時,也可以使用 Reactor 模拟實作。相關内容可參見這篇文章。 MINA 正是借由 Java NIO 的 Reactor 實作的模拟 Proactor 模型。 Boost.Asio 的 Proactor 核心在非 NT Win32 平台上也是利用select() / kqueue() / epoll 等 Reactor 模拟實作的。

Reactor 按照事件觸發方式又可分為 level-triggered (LT) 和 edge-triggered (ET) 兩種,其差別詳見 epoll 的 man page 。傳統的 select() / poll() 都屬于 LT Reactor ; kqueue() 則是 ET Reactor ; epoll 是個兩面派, LT/ET 語義通吃。

前攝式模型相較于反射式模型往往更加難以程式設計。然而在具有原生異步 I/O 支援的作業系統中(例如支援 IO Completion Port 的 Win32 系統),采用前攝式模型往往可以取得比反應式模型更佳的效率。在沒有原生異步 I/O 支援的系統中,也可以使用傳統的反應式 API 對前攝式模型予以模拟。在現代的軟硬體系統中,使用 epoll 和 kqueue 的前攝式模型實作同樣可以輕松解決 C10K 問題。前攝式模型的一個顯著優勢是在實作複雜邏輯的時候不需要借助于狀态機。因為狀态機已經隐含在由回調串聯起來的異步操作鍊當中了。如果上述内容難以了解,可以參考 Boost.Asio,這是一個相當優秀的跨平台 C++ 前攝式 I/O 模型實作。

user guide:

MINA 2.0 User Guidehttp://mina.apache.org/user-guide.html

Part I - Basics

Chapter 1 - Getting Started

Chapter 2 - Basics

Chapter 3 - Service

Chapter 4 - Session

Chapter 5 - Filters

Chapter 6 - Transports

Chapter 7 - Handler

Part II - MINA Core

Chapter 8 - Acceptor

Chapter 9 - Connector

Chapter 10 - IoBuffer

Chapter 11 - Codec Filter

Chapter 12 - Executor Filter

Chapter 13 - SSL Filter

Chapter 14 - Logging Filter

Part III - MINA Advanced

Chapter 15 - Debugging

Chapter 16 - State Machine

Chapter 17 - Proxy

Chapter 18 - JMX Integration

Chapter 19 - Spring Integration