在过去几年中,REST风格的软件架构获得了越来越多的认可,这主要是因为它减少了系统对动件的需求、同时使系统耦合性更低,弹性更好。
目前越来越多的REST资源出现在企业应用中,因此对这些资源进行编排就显得非常重要了。比方说,典型的业务活动就包含了资源的创建,然后是资源的查找及其他资源的创建等。
本质上来说,与RESTful服务的交互是相当简单的:需要构造并发送适当的请求(请求头和请求体),然后分析返回的响应(响应头和响应体)。完成这个处理并不需要什么特别的工具或是框架,只要有一个好用的HTTP客户端程序库就足够了。除此之外,由于RESTful交互过程中所涉及到的不同实体是由所谓的微格式定义的,因此能够轻松解析或是输出这些实体的能力就显得非常重要了。
编排与多个资源的交互是个棘手的问题。我们需要定义编排、处理错误并不断尝试,同时系统必须能够在压力下表现良好。作为一个集成框架,Mule提供了我们所需的一切。
来考虑一个例子吧,某商业系统对新订单的处理需要如下编排:
通过向服务发送一个XML实体来创建一个新订单。
寻找新创建的订单资源并从中提取出确认信息。
根据确认信息并通过邮件网关向客户发送一条确认消息。
我们将在本文详细分析上面每一步的交互过程,同时还会介绍为了获得上述交互所需的Mule动件和Groovy特性。
总体的编排包含了一系列通过特定路由、过滤器以及内存消息队列(aka VM队列)连接起来的Mule服务。 最近InfoQ上的这篇文章介绍了Mule中的消息路由,大家不妨移步一观。
Mule对REST的支持
Mule提供了一种简单而又强大的方式与RESfFul服务交互,那就是Mule RESTPack。
Mule RESTPack提供了一整套连接器与完整的指南以帮助用户创建新的RESTful应用。在本文撰写之际,该软件包提供了三种传送器,分别基于三种流行的REST框架:Abdera、Jersey及Restlet。这样我们就可以轻松公开新的资源,但如何集成现有的REST资源呢?
好消息是Mule标准的脚本模块所提供的Groovy支持有助于Mule HTTP传送器的使用,这样我们就可以成功与RESTful服务交互了。 向Mule发送POST请求
首先来看看第一个交互。HTTP向特定的资源发送一个XML实体来创建订单,如以下程序片段所示:
POST /orders HTTP 1.1
...
<order xmlns='urn:acme:order:3:1'>
<customerId>123456</customerId>
<productId>P987C</productId>
<quantity>2</quantity>
</order>
如果成功服务器的响应如下:
201 Created
Location: http://acme.com/order/O13579
...
<order id='O13579' />