《Apache MINA 2.0 用户指南》系列博客总序
《Apache MINA 2.0 用户指南》取材自 Apache 官方指南,共分十七章,此系列博客完本后,笔者会整理一份中英文对照阅读的 PDF 文档,届时将公布下载地址。敬请期待。
《Apache MINA 2.0 用户指南》第一章:入门
本章中,我们将给你关于什么是 MINA、什么是 NIO、我什么我们在 NIO 之上开发了一个框架以及你会在其中找到什么等等的第一认识。我们也将会给你演示如何在一台 MINA 的服务器上运行一个很简单的例子。
NIO 概述
NIO API 是由
Java 1.4 引入的,从此被广泛用于各种应用。
NIO API 封装了
IO 非阻塞操作。
首先,最好了解一下 MINA 是基于 NIO 1 写的。Java 7 设计了一个新版本 NIO-2,(因为我们基于 NIO 1) 我们并没有从这一版本 (NIO-2) 所带来的新加功能中获益。
也有必要了解到 NIO 中的 N 意思是 New,但是我们在很多地方将不会使用 Non-Blocking (非阻塞) 术语。NIO-2 应该被视为一个新新 (New New) I/O...
java.nio.* 包包含了以下关键构造
- Buffers (缓冲) - 数据容器
- Chartsets (字符集) - 字节和 Unicode 码的翻译容器
- Channels (通道) - 表示实体 I/O 操作的连接
- Selectors (选择器) - 提供可选择的、多路非阻塞 IO
- Selectors (正则表达式) - 提供一些操作正则表达式的工具
我们在
MINA 框架中最感兴趣的是 Channels (通道)、_ Selectors_ (选择器) 以及 Buffers (缓冲),除非我们想要对用户隐藏这些元素。
本用户指南因此将把重点放在基于这些内部组件构建的每个对象上。
NIO vs BIO
很有必要来了解一下这两个 API 之间的差别。
BIO,或者叫做
Blocking IO,依赖于用于阻塞模式的普通套接字:在你在套接字上进行读、写或者任何操作的时候,被调用的操作在操作结束之前将会一直阻塞住调用者。
在某些情况下,能够调用这些操作是很重要的,并且希望被调用的操作在其操作结束之后能够通知调用者:这样调用者在这段时间之内可以做一些其他的事情。
这也是在你具有众多连接的套接字时
NIO 所能提供的一个更好的方式的地方:你无须为每个连接创建一个特定的线程,你仅仅需要很少的几个来做同样事情的线程。
如果你想获得涵盖有 NIO 的更多信息,互联网上有很多相关的不错的文章,也有一些关于这方面内容的出版的书籍。
Why MINA?
写网络应用常常被视作一种高负担但低水平的开发。这是一个不经常为程序员所学习或者了解的领域,这可能是因为这些内容是在很久以前在学校里学过但都忘光了,也可能是因为这一网络层的复杂性常常被更高层的传输层所隐藏以致你从来没有深入它。
补充一点,当涉及到异步 IO 时,一个额外的复杂的层出场了:时间。
BIO (Blocking IO,阻塞 IO) 和
NIO (Non-Blocking IO,非阻塞 IO) 之间的最大的区别在于在 BIO 中,你发送了一个请求,然后你将在得到回复之前一直等待。在服务器端,这意味着一个线程可能会涉及到任何进入的连接,因此你不需要应对多路复用连接的复杂性。另一方面,在
NIO 中,你必须应对非阻塞系统的同步特性,这意味着在一些事件发生时你的应用会被调用。在
NIO 中,你无需调用了以后等待一个结果,你发送一条命令之后,结果就绪了你会被通知。
框架所需要的
考虑到这些不同,以及大多数应用程序在调用网络层的时候通常会期望一个阻塞模式,最好的解决方案就是通过写一个阻塞模式的模仿框架来隐藏掉这一表象。这就是
MINA 所做的事情!
但是
MINA 做的事情不仅于此。它为需要通过
TCP、
UDP 或者任何机制通信的应用提供了一个通用 IO 幻像。如果我们仅仅考虑
TCP 或者
UDP,一个是有连接的协议 (
TCP) 另一个是无连接的 (
UDP)。
MINA 将这种差异掩盖起来,以让你关注于对你的应用很重要的两部分:实用的代码和应用协议的编码/解码。
MINA 不仅仅处理
TCP 和
UDP,它也使用
VmpPipe 或者
APR 提供了一个串行通信 (
RSC232) 之上的一层。
最后,很重要的是,
MINA 是一个专门设计既能工作在客户端又能工作在服务器端的网络框架。写一个服务器的关键在于具有一个可扩展性的系统,这样可以灵活地满足服务器需求,根据性能和内存使用:这就是
MINA 的优势,使你的服务器开发变得容易。
何时使用 MINA?
这是个有趣的话题!
MINA 并不期望在任何情况下都是最好的选择。在考虑使用
MINA 之前要思考几个要素:
- 易于使用。在你没有特别性能要求时,MINA会是一个好的选择,因为它可以让你轻松地开发一个服务器或者客户端,在BIO或者NIO之上写同样的应用时不需要应付各种参数和用例。只需要几十行代码就可以写你的服务器,有一些你可能会落入的陷阱。
- 侍服高并发的用户量的能力。BIO明显地要比NIO快。这点使得 30% 的用户喜欢BIO。对于数千个用户连接的情况确实如此,但是一旦达到某个点,BIO方式将会停止扩展,你无法使用一个线程一个用户的方式来处理上百万用户的并发。NIO可以。现在,另一方面是,相对于你的应用所消耗的时间,你的代码中花在MINA部分的时间实际可能是微不足道的。在某种情况下,不需要花费更多时间和精力来写一个更快的网络层以获得些许提升的目标。
- 被证明的系统。MINA已被全球数以万计的应用所使用。也有一些基于MINA的 Apache 项目,而且它们工作的相当好。这就是某种形式的担保,你不需要为你网络传输层的实现的一些神秘的错误而花费大量的时间。
- 现有协议的支持。MINA附带有对各种现有协议的实现:HTTP、XML、TCP、LDAP、DHCP、NTP、DNS、XMPP、SSH、FTP ...在某种情况下,MINA不仅可以作为一个NIO框架,也可以作为一个具有各种协议实现的网络传输层。MINA近期要推出的新特性之一就是提供一个你可以使用现有的协议的集合。
特性
MINA 是一个简单但功能齐全的网络应用框架,它提供:
- 为不同的传输类型统一 API:
基于 Java NIO 的 TCP/IP 和 UDP/IP
基于 RXTX 的 串行通信 (RS232)
In-VM 通道通信
你可以实现你自己的!
- 过滤器接口作为扩展点;类似于 Servlet 过滤器
- 低层和高层 API:
低层:使用 ByteBuffers
高层:使用用户定义的消息对象和编解码器
- 高可定制化的线程模型:
单个线程
一个线程池
多个线程池 (比如 SEDA)
- 使用 Java 5 SSLEngine 的开箱可用的 SSL · TLS · StartTLS 支持
- 超负载保护和流量调节
- 使用模拟对象单元测试
- JMX 可管理性
- 使用 StreamIoHandler 的基于流的 I/O 支持
- 知名容器诸如 PicoContainer 和 Spring 的集成
- 从 Netty 的平滑迁移,Apache MINA 继承于 Netty
开始的步骤
我们将通过运行一个
MINA 包提供的很简单的例子给你演示使用 MINA 是多么简单。
想要在你的应用中使用
MINA 的第一件事是要设置环境。我们将描述你需要安装什么,以及如何运行一个
MINA 程序。没啥大不了的,先来体验一下
MINA 吧 ...
下载
首先,你需要从
下载区下载到最新
MINA 发布版。建议选择最新版,除非你有非常好的理由不这么做 ...
一般来说,如果你要使用
Maven 来构建你的项目,你甚至不需要下载任何东西,你只需依赖进一个包含了
MINA 库的 repository:也就是说你只需告诉
Maven pom 你需要使用
MINA 包。
里边是什么
下载完成后,将 tar.gz 或 zip 文件的内容释放到本地磁盘。下载的压缩文件具有以下内容。
在 UNIX 系统,输入:
你将会在 apache-mina-2.0.7 目录下得到以下内容:
内容详情
- dist - 包含了MINA库代码的 jar 包
- docs - 包含了 API 文档和代码参照
- lib - 包含了使用 MINA 所需要的所有 jar 包
除此之外,基目录下还有两个许可和公告文件。
运行你的第一个 MINA 程序
下载完发布版之后,让我们运行一下发布版附带的第一个
MINA 例子吧。
将以下包放进 classpath
- mina-core-2.0.7.jar
- mina-example-2.0.7.jar
- slf4j-api-1.6.6.jar
- slf4j-log4j12-1.6.6.jar
- log4j-1.2.17.jar
**日志提示**
*Log4J 1.2 用户:slf4j-api.jar、slf4j-log4j12.jar;
Log4J 1.2.x * Log4J 1.3 用户:slf4j-api.jar、slf4j-log4j13.jar;
Log4J 1.3.x * java.util.logging 用户:slf4j-api.jar 和 slf4j-jdk14.jar。
重要提示:请确认你使用了匹配于你的日志框架的正确的 slf4j-*.jar。例如,slf4j-log4j12.jar 和 log4j-1.3.x.jar 不能够同时使用,否则会发生故障。如果你不需要一个日志框架,你可以使用没有日志的 slf4j-nop.jar 或者仅有最基本日志的 slf4j-simple.jar。
在命令行中输入以下命令:
这将启动服务器。现在 telnet 将会看到程序已启动。
输入以下命令来 telnet:
现在我们已经运行了第一个 MINA 程序。请试着运行 MINA 所附带的其他一些例子程序。
本章总结
在本章中,我们了解了基于 MINA 的客户端以及服务器端的应用体系。我们还涉及了 TCP 服务端/客户端、UDP 服务器端和客户端的例子实现。
在接下来的章节中我们将会讨论 MINA 的核心结构以及一些高级主题。