以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 EAI/SOA基础与技术 』  (http://bbs.xml.org.cn/list.asp?boardid=73)
----  SOA 中新出现的一些概念:XML Feeds 和聚合的 Web 服务[转帖]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=73&rootid=&id=46981)


--  作者:supremeweb
--  发布时间:5/16/2007 4:44:00 PM

--  SOA 中新出现的一些概念:XML Feeds 和聚合的 Web 服务[转帖]

VirtuaWOX Calendar Feed 1.0:使用按照规范的 XML 开发方法实现分层聚合的 Web 服务

级别: 中级

[URL=http://www.ibm.com/developerworks/cn/webservices/ws-soa-aggws/index.html#author]Gboyega Sanni[/URL] ([URL=mailto:gboyega.sanni@virtuawox.com?subject=SOA 中新出现的一些概念:XML Feeds 和聚合的 Web 服务 &cc=gboyega.sanni@virtuawox.com]gboyega.sanni@virtuawox.com[/URL]), 顾问


2007 年 5 月 14 日

面向服务的应用程序的实现是一个混合过程,目前它仍处于发展过程中。在本文中,我们将介绍一个新出现的概念,它可以帮助读者开发基于新术语的应用程序,该术语称为通过按照规范的 XML 开发方法实现分层聚合的 Web 服务 (LAWS)。这个新的术语将用于开发日历 Feed 产品。LAWS 是一组 Web 服务的集合,这些服务在将不同的 XML 规范聚合在一起的过程中用作不同的层。按照规范的 XML 开发方法是,通过一个或多个业务交互关系图对 XML 规范流进行概念化,然后将其实现为不同的服务。日历 Feed 是一些新闻 Feeds 的聚合集合。
概述

由于各种规范(如 XML、XSL 样式表、RSS、WSDL、SOAP 和 BPEL)的出现,更有可能通过集成和聚合来实现面向服务的应用程序。在本文中,XML 为这些规范的集成提供了基础。一个真正的面向服务的应用程序可以将不同类型的规范聚合在一起,由 Web 服务动态地生成。为了简要介绍如何实现这种面向服务的体系结构,我们实现了一个日历 Feed,以此作为通过 LAWS 实现的大型的面向服务的应用程序的一个缩影。

之所以使用了 LAWS,是因为需要使用 XML 规范将日历 Feed 实现为可重用的对象。首先开发了一个简单的日历 XML 规范,然后逐步地添加附加的聚合 XML 规范层。因此,本文的核心内容更关注于 XML 和 XSL 规范的开发,而不是通过编程/编写脚本来实现面向服务的体系结构中的某层。

指定日历 Feed 用户功能需求

日历 Feed 是一种 Facade Web 服务,因为它在底层将各种 XML 规范聚合在一起,以便基于新的和现有的 Web 服务来提供显示用户活动的功能。可以按如下所述来实现其功能需求:

用户可以查看日历
用户可以查看日历中包含新闻 Feed 和其他相关活动(如提醒和事件)的特定单元
面向服务的对象的可重用性基准检验

我们不会花很多的时间对日历对象进行基准检验,但是您可以认为该日历对象可以满足一些可重用性的需求。例如,有许多不同形式的日历对象,如挂在墙上的纸质日历、手表中的日历、桌面日历、JavaScript 对象日历,等等。其中最重要的可能是,许多应用程序、Web 或者桌面都使用了日历对象。尽管 Web 上存在许多 JavaScript 日历对象,但是很难将它们集成到一个应用程序中、动态地重新定义或者重新配置。面向服务的日历应该可以满足下列需求:

可以从一个 Web 或桌面应用程序中通过 Web 服务使用标准编程语言来调用它。
可以动态地对其进行重新配置。
为日历 Feed 设计业务交互模型

[URL=http://www.ibm.com/developerworks/cn/webservices/ws-soa-aggws/index.html#table1]表 1[/URL] 和[URL=http://www.ibm.com/developerworks/cn/webservices/ws-soa-aggws/index.html#fig1]图 1[/URL] 显示了由本文作者开发的七个层,它们按照逆序列关系图进行显示。还可以通过其他方式对其进行查看,但这超出了本文的讨论范围。值得说明的是,与 Web 服务进行通信时所使用的不同文档类型之间并不存在什么差别。这些 XML 相关的文档可能是 SOAP、WSDL、RSS Feeds 或者甚至是自定义的 XML 文档,等等。


表 1. 层 ID 和名称
层 ID Web 服务
1 Calendar Web 服务
2 Calendar 样式表
3 Calendar Web 服务和样式表
4 新闻 Feed
5 经过筛选的新闻 Feed Web 服务
6 聚合的日历 Web 服务
7 聚合的日历 Web 服务和样式表

可以将日历 Feed 的业务交互关系图可视化为某种形式的“面向服务的工厂模式”,这是另一个新出现的面向服务的概念。其中在与以生产线方式工作的计算机集群进行级联工作的不同服务之间存在着并行操作,所以很容易看出某个服务在设计上使用了不同的聚合“工厂”类型。


图 1. 日历 Feed 的业务交互关系图
按此在新窗口浏览图片

指定日历 Web 服务层

这一层包括基于输入参数(日期、月份和年)自动生成的 XML 规范。

描述:日历是动态对象,它可以表示为包含 month 和 day 标记的一个动态 XML 文档。
输入参数:(月,年)
方法参数:(一种日历算法)
输出参数:(自定义的 Calendar XML 文档)

清单 1. Calendar XML 规范
                
<?xml version="1.0" encoding="ISO-8859-1"?>
<month><mnth-info>7</mnth-info>
<yr-info>06</yr-info>
<week>
<sat>1</sat></week>
<week>
  <sun>2</sun><mon>3</mon><tue>4</tue><wed>5</wed><thu>6</thu>
  <fri>7</fri><sat>8</sat>
</week>
<week>
<sun>9</sun><mon>10</mon><tue>11</tue><wed>12</wed><thu>13</thu>
<fri>14</fri><sat>15</sat>
</week>

<week>  
<sun>16</sun><mon>17</mon><tue>18</tue><wed>19</wed><thu>20</thu>
<fri>21</fri><sat>22</sat>
</week>
<week>
<sun>23</sun><mon>24</mon><tue>25</tue><wed>26</wed><thu>27</thu>
<fri>28</fri><sat>29</sat>
</week>
<week><sun>30</sun><mon>31</mon>
</week>
</month>
     


组成日历样式表层

这一层包括用于将日历 Web 服务转换为 HTML 规范的预定义样式表规范。这个 XSL 规范中有一些重要的部分需要进一步说明。例如,这个 XSL 规范还包含 JavaScript 代码,以显示日历条目的另一种可选视图。这种功能可以满足用户希望能够在日历中查看包含新闻 Feed 和其他相关活动的特定单元的需求。在缺省情况下,每个日历单元通过日历 XML 规范填入相应的文本,这是一种非常灵活的设计。在内容上而不是标记上,样式表层完全独立于服务层。因此,其内容可以动态地从多个数据源提取、聚合并确定其样式。


清单 2. Calendar XSL 规范
                
<?xml version="1.0" encoding="ISO-8859-1" ?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Calendar Feed Style Sheet 1.0
</title>
<script language="Javascript">
function getDialog(o){
var oDay = o.innerText;

if (oDay  != "") {

var oMonth = document.getElementById("oMonth").innerText;
var oYear = document.getElementById("oYear").innerText;


var url = "http://www.virtuawox.com/displayDate.asp?";

//Section One
//var qString = "month=" +  oMonth + "&day=" + oDay +  "&year=" + oYear;
var qString = "oText=" + oDay
notes = window.open (url+qString,"url","status=1,width=400,height=400,resizable=false");
notes.focus();

}

}

</script>
</head>
<body style="font-family:Arial,helvetica,sans-serif;font-size:12pt;
background-color:white">
<center>
<table border="1" width="800" height="400">
<tr style="background-color:BB9933;color:white;padding:4px">
<td>SUNDAY</td>
<td>MONDAY</td>
<td>TUESDAY</td>
<td>WEDNESDAY</td>
<td>THURSDAY</td>
<td>FRIDAY</td>
<td>SATURDAY</td>
</tr>
<xsl:for-each select="month/week">
<tr style="background-color:CCCC10;color:black;padding:4px">
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Sunday">
<font size="1" color="black">
<xsl:value-of select="sun" />
</font>
</td>
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Monday">
<font size="1" color="black">
<xsl:value-of select="mon" />
</font>
</td>
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Tuesday">
<font size="1" color="black">
<xsl:value-of select="tue" />
</font>
</td>
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Wednesday">
<font size="1" color="black">
<xsl:value-of select="wed" />
</font>
</td>
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Thursday">
<font size="1" color="black">
<xsl:value-of select="thu" />
</font>
</td>
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Friday">
<font size="1" color="black">
<xsl:value-of select="fri" />
</font>
</td>
<td  width="16%" style="cursor:hand;" onclick="getDialog(this);" value="Saturday">
<font size="1" color="black">
<xsl:value-of select="sat" />
</font>
</td>
</tr>
</xsl:for-each>
</table>


<xsl:for-each select="month">
<div id="oMonth" style="visibility:hidden;">
<xsl:value-of select="mnth-info"/>
</div>
<div id="oYear" style="visibility:hidden;">
<xsl:value-of select="yr-info"/>
</div>
</xsl:for-each>
</center>
</body>
</html>

      


呈现日历 Web 服务和样式表层

为了获得 HTML 规范,这一层中出现了日历 Web 服务的样式表。


图 2. Calendar XML 和样式表规范
按此在新窗口浏览图片

提取新闻 Feed 层

这一层涉及到任何公开可用的新闻 Feed(使用 RSS 格式,并且可以从 Web 站点获得)。我们将使用 New York Times 新闻 Feed,因为它具有聚合的潜能。如果像面向服务的日程安排软件那样,新闻 Feed XML 规范时间跨度超过两个月或两个月以上,那么新闻 Feed 可能具有巨大的聚合潜能。在一个理想的设置中,它的时间跨度应该为多个月。其中隐含的是,如果这个新闻 Feed 的时间跨度仅为一个月,那么该服务就必须提取每个月的内容,这种方法是否可行则取决于该月的新闻 Feeds 的多少。或者,如果我们只有少量的新闻 Feeds,那么更好的做法是提取一个 XML 规范并为用户会话缓存该文档以改进性能;如果用户会话比较简短,那么这样做的缺点是用户会话无法包含当前的 Feeds。这个概念引入了另一个新出现的概念“面向服务的缓存”,它描述了何时以及如何缓存面向服务的 XML 规范。我们已经简要地介绍了在聚合 Web 服务时存在许多可选的方法。

筛选新闻 Feed 层

这一层用于为新闻 Feed 层筛选和转换 Web 服务,并为了实现聚合而将其转换为所需的 XML 兼容格式。


清单 3. 筛选规范
                
<?xml version="1.0" encoding="ISO-8859-1"?>
<items>
<item date="sun, 30 jul 06">
Behind the Wheel: 2007 Dodge Caliber: More Bang for the Buck
</item>
<item date="sun, 30 jul 06">
Around the Block: A Look at an Overlooked Hybrid
</item>
<item date="sun, 30 jul 06">
Green Tech: P What? PZEV?s Are UnSung Heroes in the Push to
Celan up the Air
</item>
<item date="fri, 28 jul 06">
Wheelspin: Tulsa?s Big Dig: A ?57 Plymouth Is the Prize
</item>
<item date="fri, 28 jul 06">
Collecting: Welcome to New York City, Motown of the early 20th Century
</item>
<item date="sun, 23 jul 06">
With $3 Gas, Detriot Pays for Its Past
</item>
<item date="sun, 23 jul 06">
Mercedes Unit Helps Parent Doulbe Profit
</item>
<item date="sun, 23 jul 06">
Green Tech: Grease Is the Word: Fill It Up With Fry Oil
</item>
<item date="fri, 21 jul 06">
Collecting: Batteries Still Include: Those Eclectic Electrics
</item>
<item date="fri, 21 jul 06">
Handlebars: Among the Ninjas, a Faster New Master Emerges
</item>
<item date="sun, 16 jul 06">
Toyota's Leader Expresses No Interest in Forming Alliance With G.M.
</item>
<item date="sun, 16 jul 06">
BMW Selects Production Head As Next Chief
</item>
<item date="sun, 16 jul 06">
Behind the Wheel: A Wind That Blew In and Breezed Out
</item>
<item date="sun, 09 jul 06">
Design: Car Stylists Decide That Now Is a Perfect Time to Vent
</item>
<item date="sun, 16 jul 06">
Green Tech: A Well-Bred Engine Carries Best Genes of Its Parents
</item>
<item date="mon, 17 jul 06">
Motoring: Safer Streets Just a Chuckle (or an Enchilada) Away
</item>
<item date="sun, 09 jul 06">
Many Ways to Turn Fuel Into Power
</item>
<item date="fri, 07 jul 06">
How Far Would You Drive to Avoid a Rental-Car Tax?
</item>
<item date="fri, 07 jul 06">
Handlebars: Cheap, Chic and Sociable: The Buzz About Scooters
</item>
<item date="sun, 02 jul 06">
G.M. Bows to Request By Biggest Shareholder
</item>
<item date="sun, 02 jul 06">
Jump-Start or New Battery for G.M.?
</item>
<item date="sun, 02 jul 06">
Handlebars: Out of New Orleans, Confederate Rises
</item>
<item date="sun, 02 jul 06">
You Call This a Car? We Have Bigger Cockroaches
</item>
<item date="sun, 25 jun 06">
WHAT'S NEW: Dodge Challender Gets a Green LIght
</item>
<item date="sun, 25 jun 06">
A Likable Heir to the Throne
</item>
<item date="sun, 25 jun 06">
Behind the Wheel: So Late to the S.U.V. Party, but So Smartly
Dressed
</item>
<item date="sun, 25 jun 06">
Collecting: My Cars, Film Stars
</item>
<item date="sun, 25 jun 06">
Around the Block: Thank You. Saab. May I Have Another?
</item>
</items>
      


聚合新闻 Feed 层

这一层从经过筛选的新闻 Feed 层将特定的信息聚合到基本日历 Web 服务中。这个规范和“未聚合的日历服务”之间仅有的差别在于,聚合的 Web 服务将来自业务流程内部或外部的其他服务的信息插入到每个日历单元中。如上所述,样式表层独立于服务层,因此,您可以基于不同的样式表规范快速地“切换”视图(本文中没有对此进行介绍)。下面介绍了一些用于该 Web 服务的 XML 规范。


图 3. 聚合的日历 Web 服务规范
按此在新窗口浏览图片

这里使用了一种锁定机制,类似于数据库或者线程中的概念。锁定机制是指 Web 服务输入的隐藏的实现。这种方式的出现是因为,尽管您可以查看聚合的 XML,但这种方式的实现无需将 RSS 新闻 Feed 作为输入参数传递到聚合的 Web 服务,即聚合的 Web 服务规范。因此,在无法接受输入参数、或者从其他 Web 服务或数据库中动态地提取输入参数时,可以锁定一个 Web 服务。

使用样式表层实现聚合的日历 Web 服务

这一层将聚合的日历 Web 服务层与前面定义的样式表层合并到一起。可以在开发的应用程序级中应用各种样式表规范。因此,完全有可能开发一个子层,基于登录到某个具有已保存的“样式”首选项附加特性的系统中的用户类型,由这个子层使用不同的样式表来调用 Web 服务。


图 4. 聚合的日历 Web 服务和样式表规范
按此在新窗口浏览图片

总结

本文介绍了许多新出现的面向服务的概念,如将面向服务的应用程序的实现作为一种产品开发过程类型、分层聚合的 Web 服务、按照规范的 XML 开发方法、面向服务的对象的可重用性基准检验、面向服务的工厂模式、子层、面向服务的锁定和缓存。因此,通过构建各种层和服务层,可以使用不同的方法来实现“无缝的”面向服务的体系结构。在分层的面向服务的体系结构中使用按照规范的 XML 开发方法,还可以确保服务开发团队在为服务编写脚本或编写程序之前,通过业务交互关系图指定相应的需求。

有一个重要的层在本文中没有介绍,即安全子层,它可以在不同的应用程序级上进行安全管理。例如,可以将一个聚合的 Web 服务嵌入到安全层中,后者可以处理 Web 服务输入的验证。这个安全层可以封装一个 Web 服务。

最后,本文所介绍的使用分层聚合的 Web 服务进行日历 Feed 的开发是一种部分聚合,因为用于聚合的新闻 Feed 仅涉及到若干个月份,当对整年的内容进行聚合时才会发生完整的聚合。因此,为了能够得到完整的聚合,需要从新闻 Feeds 中提取任何月和年的内容(从最开始以来),就像在新闻站点中一样。



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms