最近, 公司又整了一套FLEX的框架, 没想到几年后又捡起了FLEX,不过现在已经是4.0了, 今天又学习了一下BlazeDS, 所兴将好的介绍记录下来. 最简单的理解是:它就是一个处理系统间消息格式化的...具体的看下面介绍.
在日常的RIA开发中,Flex或者基于纯Actionscript3的RIA应用非常普遍。 在客户端与服务端的交互中,大家用的比较多的几种方式是:纯文本内容,XML,JSON等。 不过,随着Adobe将AMF协议开源,越来越多的人开始使用基于AMF协议的实现来与服务器交互数据。 而BlazeDS是Adobe发布的一个开源AMF协议服务器端Java实现. 通过BlazeDS,你可以开发基于Flex,Actionscript3的客户端应用程序,并且使用AMF(Advanced Message Format)与服务器交互数据。本文是这个系列教程中的第一篇,目的是介绍AMF协议。
AMF协议是Adobe开发的一种消息交换协议,其优点包括
- 更小的数据传输量
由于AMF协议采用了二进制的编码方式,省去了很多控制符。比如在XML中,我们传输一段数据,需要把许多XML标签都传输过去,类似于<item></item>此类的控制符没有太大的实际意义,但是很大程度上增加了数据传输量。
AMF协议则省去了大部分的可见控制符,采用二进制编排方式,效率极高。另外,由于同时也对数据进行了压缩,因此同样的数据,可以极大节省带宽。如果你的服务器每天的流量在1百万以上的访问,这些节省的流量则是相当客观的
- 更安全的数据传输
在基于二进制编码的前提下,数据被编码传输。虽然不能满足加密数据的需要,但是,可以避免其他人直接查看数据内容。
- 对程序员更友好的数据接口
AMF本质上也是一种远程方法调用的支持协议,其可以将服务器端或者客户端的对象序列化,当数据被传输到目的端时,重新反序列化成目的端的内存中的对象。
大家在进行XML操作的时候,会花费很多精力处理XML的编码与读取。比如在服务器,大家需要将数据从数据库或者内存中的某处取出,对其进行一定的数据编码,生产一个XML文档。发送到客户端,在客户端,则需要将XML解析,将其中的数据还原到内存中。 这个过程在使用AMF协议的时候,就被省略了。AMF协议可以很好的支持J2ee开发中的VO模式。
- 数据的传输稳健性更高
这也许不是AMF协议自身的功能,而是要归功于Flash Player.由于我们使用AMF协议的时候,一般都是使用基于Flash客户端。我们在开发过程中测试传送100万条数据。如果使用浏览器的Javascript引擎接受,不管使用任何编码协议,I.E浏览器几乎是要崩溃的,Firefox则是运行极为缓慢。而在使用AMF协议传输到Flash播放器中传输这些数据,对于客户端的影响则是要小很多的。最起码程序还能正常响应.
在开发Flex应用程序的时候,根据后端服务器使用的不同情况,目前可以支持AMF的编程语言有.Net,Java,PHP,Ruby on Rail,python,curl, ColdFusion 等.
我们这次主要介绍的是BlazeDS,基于Java的一个AMF实现。也是Adobe 官方给出的一个开源实现。
源码SVN:
http://opensource.adobe.com/svn/opensource/blazeds/
下载带Tomcat服务器的整合包,解压后可以直接运行,体验例子:
http://flexorg.wip3.adobe.com/blazeds/3.0.x/milestone/3978/blazeds-turnkey-3.2.0.3978.zip
下载部署包,仅仅源码所必须的内容:
http://flexorg.wip3.adobe.com/blazeds/3.0.x/milestone/3978/blazeds-bin-3.2.0.3978.zip
在对其文件结构和配置进行介绍前,我先介绍一下BlazeDS的结构。 这个图翻译自Adobe的BlazeDS官方文档
在BlazeDS中,其结构被设计为多层的传递式构建。
端点(Endpoint) (在MessageBrokerServlet中实现)
我们一般可以看到,BlazeDS暴露的Endpoint有几种
- 提供远程方法调用的
这种endpoint是最常见的一种endpoint,其默认形式是 /messagebroker/amf 或者如果通过https协议访问则是/messagebroker/amfsecure
- 提供普通http服务端
普通HTTP服务其是就是我们最常见的一些以xml形式或者逗号分割符的形式返回纯文本内容的形式。这里不加详细分析 其默认访问形式 /messagebroker/http 或者 /messagebroker/httpsecure
- 提供消息流的
所谓消息流其实是Steaming, 他的含义通过标准的HTTP协议,提供防火墙穿透力很强的即时信息服务。其实现原理是客户端发出一个HTTP请求,服务器会将这个http请求放入休眠状 态。由于http协议的特性,一个请求如果没有返回,则这个请求的tcp/ip连接是保持的。 当服务器端有消息的时候,他会激活这个睡眠的线程请求,让其返回。客户端收到这个返回后,会重新发出一个新的请求,用于取出服务器上的消息。然后重复等 待。这个endpoint的形式一般为 /messagebroker/streamingamf
- 提供服务器polling的.
polling也就是我们所说的刷服务器法。 每隔一定的时间间隔,刷新服务器去获取新的消息更新。这个方法跟steaming方式的不同在于,其效率比steaming低,而且他没有steaming提供的消息即时性好.
服务(Services)
我们看到,一个来自客户端的请求,通过MessageBrokerServlet捕获后,根据请求服务种类,转交给不同服务。
这里有
- 远程方法调用服务
远程方法调用也就是我们最常用的一种服务调用方式,其作用是在Flex客户端调用服务器上的某个方法,取得其返回结果。
- 代理服务
代理服务应该用在某些特殊场合,比如客户端需要调用企业内部的某个服务器上的webservice,而客户端又处于企业防火墙外部,这种情况下,通过 BlazeDS的代理服务,可以让客户端通过BlazeDS服务器(位于企业防火墙之内而又暴露了对外访问的服务器),去访问防火墙内部的某个服务。 另外,当遇到某些服务需要跨域策略文件(crossdomain,xml)的时候,可以通过代理来实现。
- 消息服务
消息服务主要是为Flex客户端提供一个健壮的消息服务接口,你可以通过JMS适配器直接和一些企业级的消息服务器直接连接。
目标(Destination)
目标其实是一个请求的目标:
对于常用的远程方法调用来说,其目标(destination)就是某个特定的java服务,或者某个特定的配置好的Java类
对于代理目标来说,则是定义好的代理种类,比如说普通HTTP代理还是基于WebService的代理
对于消息目标来说,则是某个特定的消息服务种类。
适配器(Adapter)
适配器的作用是提供多种实现来提供某种特定的服务
对于远程调用来说,BlazeDS提供了一个默认的JavaAdapter.这个适配器允许你调用服务器上的一个Java类,
实际上,还有EJBAdapter,他可以让你的远程调用服务调用一个EJB的方法。
对于代理服务来说 不同的 适配器意味着你可以访问不同种类的代理资源,这里的例子是基于普通HTTP的代理以及基于SOAP的代理
对于消息服务来说,如果提供JMS适配器,则能让你连接到标准的JMS服务器来交换消息。如果提供一个Actionscript适配器,则可以让你在你的Flex客户端之间交换信息。