跳到导航
BEA Dev2Dev Oracle and BEA
首页 资源中心 dev2dev学堂 在线技术论坛 User Group CodeShare
dev2dev 首页 > 资源中心 > 技术文章
长期运行的服务和面向服务的架构

时间:2004-11-26
作者:Girdhar Rao
浏览次数:
本文关键字:soa
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章
下载作者提供的与本文相关的文章。
  本文详细阐述了面向服务架构(SOA )的基本原理、在应用程序集成中的重要性、长期运行的服务的基本原理,以及在J2EE环境中实现长期运行的会话和异步服务所面临的一些挑战。本文将使用一个随处适用的场景,并将提供WebLogic Workshop示例代码。

面向服务
  面向服务描述了一种新的互连系统的架构方法,并建立在以下三个简单概念的基础上:

  • 服务是一个程序,其他程序使用消息与该程序交互。
  • 客户是一个程序,人们通过该程序来使用服务。
  • 互连系统是互相连接的服务和客户的集合体。

  最终,服务仅仅是一个程序,使客户能够与之交互,并交换XML消息。服务通过WSDL定义发布其契约。交换的XML消息遵循服务所要求的模式和契约。服务本身可以遍布较大的地理距离、多个信任机构以及不同的执行环境。服务之间的边界总是明确的,服务本身是自治的。

  让我们看一个互连系统的例子。这个例子涉及下列各方(服务):

  1. 贷款申请人(客户):有兴趣获得一笔贷款APR的个人。
  2. 贷款APR提供者:这种业务(服务)在证实给定的SSN的信用报告之后,能够提供贷款APR。这种服务既是提供者(从贷款申请人的角度来看),又是客户(从信贷机构的角度来看)。
  3. 信贷机构服务:这种业务(服务)能够为给定的SSN提供信用评分。
  4. 银行服务:银行服务能够为给定的SSN提供帐户明细。
  5. IRS服务:IRS服务能够为给定的SSN提供纳税历史。

  各个行动的顺序描述如下图所示:


图 - 1

面向服务的重要性
  面向服务,与分布式对象体系架构(例如.NET或者J2EE)相反,更贴近地反映出现实世界的过程和关系。因此,面向服务描述了一种更加自然的方法,用于建模和构建软件,以解决现实世界业务处理的需要。

  当系统的不同部分由不同的组织开发和操作时,例如在企业对企业(B2B)场景中,SOA变得极其重要。面向服务的系统松散地耦合,并且设计为支持更改。事实上,服务可以以任何语言、用任何开发工具编写,并且能够在不同的平台上运行,这就使它们适合于应用程序到应用程序的集成。

  如果没有对SOA的支持,您就必须利用选定的用来实现服务的语言来暴露契约。这清楚地向客户提出了一些挑战,例如,客户必须知道特定于语言的类型系统,并且应该了解关于某一特定语言的服务提供者暴露的公共契约,等等。幸运的是,SOA不要求那些提供者向其客户公布任何具体实现的知识,因此,那些客户不必处理任何具体语言的细微差别。

长期运行的服务(LOS)
  长期运行的服务是倾向于运行很长时间的服务,并在进展中交换消息(会话)。典型的例子是一个在线的预订系统,它与用户及各种各样的服务提供者(航空公司订票系统、汽车预订系统、饭店预订系统,等等)交互。

  服务本身可能需要花很长时间去实现一个请求。在这样的情况下,服务的客户就如何调用服务提供者而言具有以下选择:

  1. 同步模型:调用服务,并且一直阻塞到服务应答。


  2. 轮询模型:调用服务和轮询服务,直到接收到所需要的应答。


  3. 异步模型:调用服务,并且当它准备好应答时,让服务回调客户。该模型可以通过在客户那里或者在服务器上缓冲调用来实现。


  很明显,选项1和选项2消耗客户和它的资源;换句话说,这样一种服务的客户被禁止为它自己的其他客户提供服务。选项3看起来是与长期运行的服务以及与取决于其他服务的服务进行通信的最有效率的方式。

  这时需要一种协议,因为当客户准备好应答时,它必须告诉服务在哪里回调。在这样的一个模型中,只有回调地址是不够的,因为当回调到达客户那里时,客户需要对回调的上下文保持警觉。

长期运行的服务所面临的挑战
  消息交换和异步特性是所有长期运行的服务(LOS)的重要属性。每当一次会话涉及一套服务时,就会出现下列挑战:

  1. 寻址变得必不可少;服务需要知道它们正在与谁会话。
  2. 惟一的会话ID也必须与消息一起交换,以便服务确切地知道它们正在谈论什么。
  3. 任何一方的状态管理和持久性对于满足LOS的要求是必要的。
  4. 底层的体系架构应该能够中止运行中的服务,直到获得更进一步的通知才恢复执行。服务中断是LOS的另一个重要的特性。
  5. 为了管理状态及其持久性,LOS应该具有它们自己的生命周期。
  6. 每当必须发出一个调用或者接收一个调用时,都与敏感信息的消息有关。获取这样的消息本身就是一项挑战。

J2EE API和各种Web服务标准有助于实现长期运行的服务(LOS)
以下J2EE API和各种各样的Web服务标准可以用来实现Web服务容器,该容器能够支持一个LOS客户以及一个LOS服务:
1. 因为存在对状态管理和持久性的需要,所以EJB是正确的选择,因为持久性应该在事务上下文中处理。
2. 基于回调位置的消息缓冲和消息路由可以通过利用JMS来完成。
3. JTA和JTS可以(间接地通过JMS和EJB)用来处理事务要求。
4. Web服务安全性,它负责消息级别的安全性,可以保护消息并理解受保护的消息。
5. Web服务寻址和路由可以用来实现回调。

dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分