您好,欢迎访问三七文档
APACHEMINA介绍一个高性能的NIO框架讲座目标•MINA的用途•MINA选择MINA的理由•MINA的快速入门•MINA的高级话题MINA的用途背景,用途以及所支持的功能的一个简略介绍,让大家认识MINA,对它有个初步概念。这就是本章的目的。ApacheMINA(MultipurposeInfrastructureforNetworkApplications)是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的MINA版本支持基于JavaNIO技术的TCP/UDP应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA所支持的功能也在进一步的扩展中。目前正在使用MINA的软件包括有:ApacheDirectoryProject、AMQP(AdvancedMessageQueuingProtocol)、RED5Server(MacromediaFlashMediaRTMP)、ObjectRADIUS、Openfire等等。Apache直属MINA的子项目有:FTPServer,AsyncWeb,SSHDMINA的用途背景介绍MINA暂时分为1.x和2.x两个主版本,这次讲座主要讲解2.x的版本。两版本之间的主要区别在于1.x使用传统IO方式,而2.x使用NIO。NIO比传统IO的优势在于NIO是无阻塞的,而传统IO是阻塞的,所以2.x版本性能会有所提高。由于NIO比传统IO更加难于理解,实现更加复杂,如果想自己开发一个基于NIO的高性能服务器会有所难度,并且会承担一定得风险。所以这也是为什么我们会使用MINA框架的原因,利用她我们可以简单的,快速的开发一个高并发,高稳定的服务器。MINA封装复杂的NIO实现,利用抽象的事件驱动的异步API来支持客户的开发,这也是为什么利用MINA可以进行快速开的原因之一。MINA的用途特点概要ApacheMINA也称为:•NIO框架库•客户端、服务器框架库•一个网络套接字库从这些名字可以得知她是一个全功能的网络应用程序框架,2.x版本支持如下:•为不同的传输类型提供了统一的API•通过JavaNIO提供TCP/IP和UDP/IP支持•通过RXTX提供串口通讯(RS232)•In-VM管道通讯•过滤器作为一个扩展特性;类似Servlet过滤器•高度定制化线程模型•使用Java5SSL引擎提供沙盒(Out-of-the-box)SSL·TLS·StartTLS支持•超载保护和传输流量控制•JMX管理能力MINA的用途功能概要选择MINA的理由在java世界中,框架繁多,就网络框架而言,我们为什么要选择MINA2这确实值得我们探讨一下。下面的小节中将本着对软件开发最基本的两点出发进行对比:1.性能的对比2.程序实现的复杂性对比在传统I/O中,最简单实现高并发服务器的编程方式就是对每一个客户开启一个线程。但是这种方式有如下几个弊端:•客户端上限很大的情况下不能及时响应•服务器硬件资源受限,性能也会急剧下降•受制于操作系统的限制优点还是有的:•编码简单,实现容易•一定数量的连接性能比较好。参见实例:TraditionalIOServer0选择MINA的理由传统I/O与NIO的区别为了解决每一个线程一个用户的模型,我们可以想到用多个线程处理N个用户,这样既可以保证处理多个用户的同时,线程开销降到系统的临界点。这样的方式与前一个模型优势在于同样的多线程,但线程数固定,充分运用系统的优势性能,又不存在多余的开销。但是缺点也是显而易见的:•轮询的消耗不可避免•客户数量固定的时候没有前一模型响应快•编码更加复杂参见实例:TraditionalIOServer1选择MINA的理由传统I/O与NIO的区别从图中可见,每一个线程维护了一组用户,然后每一个线程不断的轮询用户,哪个用户可读就读取相应的可读字节数,也就是这种方式避免了读的阻塞。但是这种方式是一种被动的方式,也就是说不管用户是否可读,都需要去轮询。为了解决这一问题,异步的NIO就成了不二之选选择MINA的理由传统I/O与NIO的区别JDK1.4提供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,又同时避免了轮询问题,但在使用上略显得复杂一些。NIO的核心思想就是多路复用,与模型二类似。但是它是基于事件机制,所以这就是能避开轮询的原因。但是需要注意的是,他们本质上是不同的,模型二只能算是一个模拟的多路复用,而NIO则是利用OS底层以及一些别的技术来达到异步多路复用的目的。选择MINA的理由NIO简单介绍MINA学习曲线很低,这主要得益于MINA的设计,基于事件的编程方式非常有利于快速开发,我们先来感受下MINA的魅力。以下几个是MINA官方给出的几个例子,可以帮助我们快速入门:•org.apache.mina.example.echoserver•org.apache.mina.example.gettingstarted.timeserver•org.apache.mina.example.haiku•org.apache.mina.example.netcat•org.apache.mina.example.proxy•org.apache.mina.example.reverser•org.apache.mina.example.tennis•org.apache.mina.example.udpMINA快速入门小实例快速浏览看完几个实际的MINA例子后可以很轻易的总结出利用MINA编程的几个大致步骤:1.创建一个实现了IoService接口的类2.设置一个实现了IoFilter接口的过滤器(如果有需要的情况下)3.设置一个IoHandler接口实现的处理类,用于处理事件(必须)4.对IoService绑定一个端口开始工作MINA快速入门实现步骤IoProcessor是处理请求的分配,包括选择Selector,超时验证,状态记录等。总之这个类和IoService一起配合工作,封装了NIO底层的实现以及MINA框架内部的功能的支持.由于过于复杂,所以不在这里讲解.IoService分为两个主要的分支接口,一个是IoAcceptor,用于服务器,另外一个是IoConneciton,用于客户端.IoService接口目的就是提供服务,有如下几个默认实现•NioDatagramAcceptor,NioDatagramConnector•NioSocketAcceptor,NioSocketConnector•VmPipeAcceptor,VmPipeConnector•ProxyConnectorMINA快速入门IoServiceIoFilter作用就是建立一层过滤网,作用于Servlet规范中的过滤器。IoFilter的默认实现比较多,有些仅供内部使用,有些是供用户使用,且过滤器的顺序可以影响程序的运行,下面列举几个常用的:•ExecutorFilter从这个过滤器后的任何操作都是工作于这个Executor中.•LoggingFilter日志操作过滤器,记录日志用的•ProtocolCodecFilter为什么协议层可以和业务层分离的原因就是他了•ProxyFilter代理过滤器,拦截住请求或响应发送给代理,但是客户端代理在M6版本中好似还没有实现,至少实例没有给出,只给出了一半。•SslFilter用于SSL加密的过滤器MINA快速入门IoFilterMINA快速入门IoHandlerIoHandler是用于我们业务逻辑处理的地方,这个没有任何实现,需要我们自己实现咯。但是IoHandler里面有一个IoSession接口需要我们注意,这个接口实际上就代表一个客户。MINA高级话题这个小节,重点讲述如何自定义协议,最后展示MINA的一些扩展功能.由于除自定义协议外,别的知识点涉及较广,所以只能点到为止.另外MINA还正在不断的开发中,有些功能以出,但是没有在实例中,只能通过阅读源码的方式来了解其中的特性和用法,我们这里讲解都是基于MINA的官方给出的实例。MINA高级话题•org.apache.mina.example.chat•Spring的支持•Jmx的支持•自定义协议•org.apache.mina.example.imagine•JMX的支持•自定义协议•org.apache.mina.example.sumup•自定义协议•org.apache.mina.example.tapedeck•Statemachine的示范•自定义协议MINA高级话题协议解码器是依赖于ProtocolDecoder这个接口:考虑到异步的原因,对过来的IoBuffer所接受的内容是不完全确定的,也就是说是IoBuffer中对一次receive后,里面存放的是不是一个完整的协议,或者是多个协议加上一些不完整的协议,又或者刚好是一个完整的协议,这些都不是确定的。基于以上原因,在实际开发当中,我们一般是实现CumulativeProtocolDecoder类.这个类的作用就是为我们解析协议提供一些帮助.这个抽象类实现了ProtocolDecoder接口中的decode接口,并抽象出一个doDecode方法。这个方法要求如果能解析一个协议,那么把这个协议解析后放入ProtocolDecoderOutput类中,并且返回true,反则直接返回false,这是需要手工回滚POS,如果不回滚,那么需要自行记录状态,以便下一次的处理在这个类中decode有两种工作方式:•完全交由doDecode处理•逻辑部分交由doDecode方法处理,IoBuffer是半自动的MINA高级话题相应的协议编码器是依赖于ProtocolEncoder这个接口:虽然同样也是异步处理,但是这里MINA可以给我们做到全自动,原因在于我们可以一次性把需要发送的写入IoBuffer中,并交给ProtocolEncoderOutput,后台会更具缓冲大小,能写多少是多少,直到把ProtocolEncoderOutput中需要发送的协议全部发送完.由于这里让我们自己实现的很简单,所以就没有提供快捷类了。MINA高级话题虽然解码有了半自动,但是这还是需要程序员去了解底层的实现,不然也很容易出错。比如是否改回滚Buffer中的POS,什么情况返回true,什么情况返回false等。为了更加通俗易懂的的处理自己协议,所以MINA还给出了另外一套实现,即:DemuxingProtocolDecoder.DemuxingProtocolDecoder继承与DemuxingProtocolDecoder,并且给出了另外一个解析接口让我们实现:MessageDecoderMINA高级话题从MessageDecoder接口中可以看到,有三个不可变静态变量:•OK:表示我可以解析这个协议,并且已经解析好了。•NEED_DATA:表示过来的数据不够,还需要接收数据。•NOT_OK:表示过来的数据不是我能解析的内容。另外需要指出MessageDecoder暂时只能与DemuxingProtocolDecoder配合使用。因为DemuxingProtocolDecoder内部已经定义好了返回这些状态后应该如何处理。除了命名上的通俗易懂的变动外,这个类还提供了多处理协议,可以为这个处理类提供多个MessageDecoder,以便让DemuxingProtocolDecoder自动去寻找应该用哪个MessageDecoder来解析到来的协议。•addMessageDecoder(Class?extendsMessageDecoderdecoderClass)•addMessageDecoder(MessageDecoderdecoder)这两个添加方法是有不同的,Class添加的解析器会默认调用class.newInstance()方法,这样的后果就是每次需要解析的时候都会去产生一个实例,且要求decoderClass必须有空的构造函数。而通过实
本文标题:MINA
链接地址:https://www.777doc.com/doc-6134998 .html