控件可以让开发人员专注于编写应用程序逻辑和委派基础性架构问题,如异步消息传送、会话和与远程资源的连接。但仍有很多复杂问题使这些应用程序难以管理。 在本文中,我们将使用内建的Weblogic Workshop控件开发一个基于Web services的示例应用程序,并用它来说明管理面向服务的应用程序的挑战。最后,我们将演示Confuluent Software公司如何给开发人员和IT人员提供可能的Web services管理解决方案,该方案与BEA WebLogic 8.1 Platform集成在一起。
为什么要面向服务?
很少有应用程序还在独自运行。相反,大多数应用程序经常被集成到应用程序到应用程序互连的复杂“网络”中。这些应用程序网络通常是完全异构的、链接不同公司所开发的应用程序、运行在不同的平台上、以不同的语言实现,并且安全保护也各异。
更糟糕的是,利用现今紧密耦合的集成方法,每个应用程序都敏锐地知晓其他应用程序的特性。这样,一个应用程序的任何改变将会在整个网络中引起一系列的级联变化。出现天文数字的开发和维护费用也不足为奇。同时,管理层会怀疑IT仍否重要,并逐年削减IT预算——总有一天,这就是紧密耦合的代价。
面向服务的构架(SOA)提供了一个出路。面向服务的应用程序通过利用基于标准的Web services技术来连接异构环境。通过在应用程序间实现松散的耦合,它们消除了变化管理上的恶梦,也就是,改变一个应用程序的实现而不会中断其他应用程序。
WebLogic Workshop控件
BEA WebLogic Workshop通过为分布式组件的组装提供易用的工具,使得构建面向服务的应用程序变得很容易,并且方便了在组件间往来的XML消息的长久会话。
在WebLogic Workshop中,任何应用程序的核心构建块是控件。控件就好像简单的Java组件(具有方法和事件),通过属性可自定义该组件的行为。控件隐藏了J2EE底层问题,这些问题包括连接远程数据库、Web services、EJB对象和消息队列。有了控件,通过设置属性,而不是调用API,就可配置这些外部资源的连接。通过促进轻松组装松散耦合的应用程序组件,控件也为实现面向服务作出了贡献。
为了进一步增强松散耦合,WebLogicWorkshop 8.1也提供了可视化的编辑器(和XQuery支持),用来建立XML接口和底层Java对象间的映射。
让我们剖析一个简单的Web services应用程序,看一看WebLogic Workshop是如何消除创建类似应用程序的苦恼的。
订单管理应用程序示例
即使实现一个简单的业务场景,例如我们订单管理Web service示例,也会有大量的技术复杂难题:
- Web service必须和给客户端用户使用的WSDL定义文件一起部署在服务器上。
- 该服务依赖并使用多种后端组件,包括数据库、EJB和其他远程Web services。
- 该服务必须强制按照被调用操作的次序执行。
- 该服务必须允许多个客户端并发调用。
订单管理Web服务的示例显示了如下操作:
- 用户能够检查未决订单的状态:
queryOrderStatus(String inAccountNumber, String inOrderNumber) - 用户可以创建一个新订单:
createOrder(String inAccountNumber, String inOrderNumber) - 用户可以提交一个新创建的订单:
commitOrder(String inAccountNumber, String inOrderNumber)
首先创建订单,如果创建成功,则提交该订单。createOrder和commitOrder必须按顺序执行。对于每个方法的调用,服务将会从客户帐户中扣除一定费用。用户帐户作为EJB建模。订单存储在JDBC兼容的数据库中。对于每一个新创建的订单,commitOrder将通知远程服务器(通过一个Web service调用)。
通过使用BEA WebLogic Workshop,并利用控件这一强大的概念,解决在创建像此类Web service的固有复杂性问题时是很容易的。图1显示了示例服务的设计视图及其所用控件。
图1:示例的设计视图
首先,在WebLogic Workshop中创建、部署和展示Web service的过程是很直接的。简单地创建一个Web service工程、添加所有的方法、编写逻辑并放置“Play”按钮。此外,WebLogic Workshop自动创建一组Web页面来测试和运行该Web service(参见清单1)。
清单 1
/**
* @common:operation
*/
public String queryOrderStatus(String inAccountNumber, String inOrderNumber)
然后对后端组件的访问,如EJB、数据库,或者甚至是远程Web services,则只是一个拖放动作(参见清单2)。一旦将使用的组件拖到项目中,它将作为一个对象出现在“代码视图”窗格中,并且可以很容易地集成到自定义代码中。
清单 2
/**
* Remote Web services
* @common:control
*/
private service.NotifyOrderServiceControl serviceNotify;
第三,确认在WebLogic Workshop中能够以给定顺序调用各种方法。从Web service所提供的每个操作能被标记为会话的一部分。这个标记也表明了操作涉及到会话中的哪个部分,这样强制必须调用这些操作中的订单(参见清单3)。
清单 3
/**
* Create a new order
* @common:operation
* @jws:conversation phase="start"
*/
public void createOrder(String inAccountNumber, String inOrderNumber)
最后,WebLogic Workshop会话能够为多个用户保持环境。会话标记指出要在会话期间保持环境信息(状态)。使用这种机制,订单管理服务能够同时处理多个客户端。
部署面向服务的应用程序也带来了新的挑战
不幸的是,世上没有免费的午餐。面向服务的应用程序大幅削减了开发和维护的费用,但代价就是管理复杂度的增加:
监视应用程序的健康状况,不仅仅是组件
单管理应用程序示例。当前的管理工具仅仅监视单个组件和组件的低级基础架构。基于这点,我们没办法验证一个分布式Web services应用程序是否工作正常。如果应用程序使用外部Web services(如合作伙伴的报价服务),那么只会激化这个问题。由于没有方法管理外部公司所运行的服务器,所以常规的监视方法完全没用了。因此在被愤怒的经理训斥前,您如何检测正在出现的问题?
不知道去哪里排除故障
一旦你开始每过几分钟就被不高兴的销售副主管所训斥,因为订单管理应用程序出错了(在季度结束前两天),您应该到哪里去查找罪魁祸首呢?是提供访问由制造IT部门所管理的存货系统的WebLogic Workshop控件吗?是这个应用程序所依赖的众多Web services之一吗?更糟的是,您怎么知道应用程序依赖哪个Web services和外部资源?随着训斥频率的增加,您仅有的资源都用来开始记录多个系统的众多日志上了。
记录审核和记帐的请求和响应
要求内部IT部门追踪软件应用程序的使用也在日渐增加,以便不同的业务部门支付其公平的IT投入份额。同样,任何跨越公司边界实现业务流程自动化的应用程序也必须拥有一个计划,用来解决发送者和接收者之间的拒付纠纷。在调用程序和被调用程序时的一致消息日志记录,是处理这些审核和记帐需求的关键。IT经理如何确保所有的开发人员在所有的入口点和退出点都实现正确级别的日志记录?对于使用XML加密进行加密的消息,您如何确保当消息被清除时没有记录(这会破坏公司的保密政策)?对于由打包应用程序本身所发布的Web services,如何完成消息日志记录?
确保始终如一地执行安全策略
即使在简化的示例应用程序中,一份文档也会在应用程序组件间传送多次。当调用createOrder操作时,客户端程序发送一个P.O;一旦该订单被提交,这个PO最终会被送到不同的Web service。为了确保端到端的保密性和完整性,开发人员可以使用WS-Security、XML加密和XML签名(BEA WebLogic 8.1支持WS-Security)。拥有这些能力是很好的,但是如果没有坚持使用,就没有购买意义了。安全构架师如何确保所有的企业间Web services在处理消息前都验证了消息的数字签名呢?
在开始将松散耦合的、分布式的应用程序向行业范围中部署时,这只是IT人员需要应对的某些新挑战。为了简洁,这里我们选择只关注几个关键问题。顺便还提及了很多其他问题——包括实现故障切换和处理传输层故障的重试规划、实现单点登录和服务版本控制。
评估用于管理SOA部署的新管理工具
现在,您应该确信成功部署Web服务最初需要处理一大堆棘手的管理问题。即使现今您的Web services仍然处于试验阶段,您也不应该推迟考虑管理方面的问题。好消息就是很多管理工具多已着眼于此。坏消息也是这样。很多新的Web services管理工具、应用服务器管理工具、系统管理工具、XML路由工具、管理器的管理工具等等,“Web services”这个单词似乎要揭露出它所有的数据表。
下面看一看为管理您所创建的、新的面向服务的应用程序找寻评估工具时要注意的几件事情。
它能非侵入地监视所有WebLogic控件和Web Services的调用吗?
在BEA WebLogic 8.1中,使用控件访问所有外部资源。这样监视延迟和所有控件调用的输入/输出的管理工具就能可视化地提供应用程序依赖的所有组件。该工具应该能“探察”任何Web services,而不管用于发布这些服务的平台是什么(J2EE应用服务器、.NET、集成代理或者打包应用程序)。监视控件和分布式Web services必须以一个非侵入的方式来完成。这至少意味着应该能够插入管理层而无需改变任何应用程序。但是管理层应该超越此要求,还应该能够不侵入应用程序的运行时行为。例如,管理层应该利用处理中的SOAP侦听机制,在任何可能的情况下都减少延迟开销并避免添加新的故障点。
它能跟踪端到端事务流和会话吗?
为了使您能够排除分布式应用程序故障,管理工具必须能够实时跟踪应用程序的执行。该跟踪必须包括应用程序用到的所有控件。
BEA Weblogic 8.1简化了异步的、会话的、应用程序到应用程序交互的创建——为了跟踪这些会话,管理工具必须能够标识和关联那些共享会话环境的消息,并具备可视化表示执行时间线的能力。进行故障排除的同时,您应该能够从一个会话中所涉及的所有Web服务调用的高层次视图向下查看,直到关于该服务内所用任何控件的执行细节。一旦问题限定到特定的控件,会话系统管理工具就可以用于调试。然后,您可以垂直向下移动执行,通过支持基础架构的多个层,从Java对象到应用服务器,向下直到操作系统,最终到达到硬件服务器。
它能够主动管理Web Services间的交互吗?
为了确保持续地实施IT策略,如日志和安全,这些动作必须从应用程序代码中提取出来,而用一个分离的策略管理层来自动执行。例如,开发人员无需再明确地编写代码来记录Web service请求和响应消息。也不必编写代码来验证数字签名或者进行压缩,或检查病毒,或任何此类操作问题。相反,通过截取消息和主动地操纵消息内容,管理层应该负责强制实行策略。如果公司以后改变了策略,例如,决定只记录消息头部而不记录所有消息内容,就无需更改代码。一个简单的配置改变就能够获得成功。
它能够与您的WebLogic 8.1开发环境集成吗?
从过去来看,应用程序已经开发和测试完毕后,工作通常集中在管理上。即使对于被动的监控工具这也不是最理想的。而对于使用主动的管理工具,这将是灾难性的。有了需要拦截传送中的消息并作用于消息的管理层,开发和管理之间的分裂消失了。需要在开发周期中先行解决管理问题,以便能够以和生产中相同的方法执行所有的测试(功能和性能)。正如上面所讨论的,主动管理工具帮助完成持久策略执行,方法是用中心配置的策略处理器替换隐藏在每个服务中的代码。要在开发早期解决管理问题,并在处理安全和日志时使用配置替代编码,您的管理工具必须与您的WebLogic开发工具和您的端到端程序开发过程完美地集成。
在全异的远程服务之间,它能够为安全/QOS策略提供单点配置吗?
随着应用程序内Web services使用的膨胀,多个应用程序将会发布和使用Web services。管理工具应该能够允许您集中查看,为环境中的任何服务提供监控、安全和QOS策略,并能向多个服务“广播”管理策略的更新,而不必本地逐台服务器和逐个服务地进行配置。
Confluent 的Web Services管理解决方案
Confluent提供了一个管理工具,可将其插入到BEA WebLogic Workshop IDE中,并添加了易用的管理功能。它允许您自动监视Web services和所有组成控件的执行,而无需任何额外的编码。
让我们在运行中快速了解这个工具,使用它管理我们的示例应用程序。
一旦您启动了BEA的CORE,您会注意到在BEA WebLogic Workshop环境下半部分的一些其他窗格(参见图2)。在右下方,有一个Configure Policy窗格,可使用它定义运行策略,以强制实行Web service,如日志、签名检查或者调用第三方SAML提供商。左下方窗格显示了订单管理Web service使用的控件——dbOrderManagement、serviceNotify和ejbAccount。单击相应的控件可切换监视控件。
图2:Runtime View选项卡
点击Runtime View 选项卡可显示所有与服务相关的会话细节。例如,在5422毫秒的时间内成功完成一个会话(表示一个订单事务开始于13.38.39)。用户也可以回顾会话、简单的操作、成功和失败的数目。
Operations 选项卡能够显示所选会话的详细信息(参见图3)。它显示了所选会话中调用的所有Web service操作。它用一个图形显示了这些操作、它们的时间、延迟和状态的次序。注意payload窗格同时显示了触发执行操作的SOAP消息和发回请求者的SOAP结果。
图3:Operations选项卡
点击Controls 选项卡可以看到更多关于所选操作内所调用的控件细节。对于每个被调用的控件,它的名称、类型、操作、状态和延迟都显示在表格和图中。
总之,Runtime View 窗格允许程序员分析Web service在多个层次的运行时行为:从会话层到操作层,最后到底层控件。
要了解关于Confluent用于BEA Weblogic的Web services管理软件的更多信息,可以查阅BEA Premier Component Gallery:http://dev2dev.bea.com/products/wlworkshop81/partners/index.jsp,或者查阅www.confluentsoftware.com。
结束语
除了WSDL、UDDI和SOAP,还有很多面向服务的应用程序。BEA WebLogic 8.1提供了一个全面的平台,用以开发企业级面向服务的应用程序。但是请记住,要尽早开始考虑管理问题。在过去忽略这一说教可能不是致命的。但现在是。
示例应用程序的源代码见:www.sys-con.com/weblogic/sourcec.cfm。
附录:示例应用程序源代码
import examples.ejb20.basic.containerManaged.Account;
public class OrderManagementService implements com.bea.jws.WebService
{
/**
* EJB holding user accounts
* @common:control
*/
private ejbControl.AccountEJBControl ejbAccount;
/**
* The remote service where notifications of committed orders are sent
* @common:control
*/
private service.NotifyOrderServiceControl serviceNotify;
/**
* The orders database control
* @common:control
*/
private database.OrderManagementDB dbOrderManagement;
// The fee charged when ever a transaction is performed
private final int BASIC_FEE = 10;
/**
* @common:operation
*/
public String queryOrderStatus(String inAccountNumber, String inOrderNumber)
throws Exception {
int result = dbOrderManagement.checkOrder(inOrderNumber);
withdraw(inAccountNumber, BASIC_FEE);
return String.valueOf(result);
}
/**
* Created a new order
* @common:operation
* @jws:conversation phase="start"
*/
public void createOrder(String inAccountNumber, String inOrderNumber)
throws Exception {
dbOrderManagement.insertOrder(inOrderNumber);
withdraw(inAccountNumber, BASIC_FEE);
}
/**
* Commits a new order
* @common:operation
* @jws:conversation phase="finish"
*/
public void commitOrder(String inAccountNumber, String inOrderNumber)
throws Exception {
serviceNotify.notifyOrder(inOrderNumber);
withdraw(inAccountNumber, BASIC_FEE);
}
/**
* Withdraws money from a customer account
*/
private double withdraw(String accountKey, double withdrawAmount)
throws Exception {
return getAccount(accountKey).withdraw(withdrawAmount);
}
/**
* <p>Helper function -- returns an EJB account for a given key<p>
*
* @return An Account object
*/
private Account getAccount(String accountKey)
throws Exception {
return ejbAccount.findByPrimaryKey(accountKey);
}
}
原文出处
http://www.sys-con.com/story/?storyid=42997&DE=1
![](http://dev2dev.bea.com.cn/images/_.gif)
作者简介 | |
Amit Dayal是Confluent Software公司产品管理方面的副主管,该公司是Web services管理软件方面的主要提供商。Amit在企业软件方面有超过14年的经验。在为Confluent公司工作之前,Amit是interKeel公司的创始人,该公司在Web services管理类中是一个先锋。 | |
Didier Guzzoni是现在是Confluent Software公司的高级软件工程师。他于1996年毕业于瑞士联邦理工大学,获得软件工程硕士学位。他曾是VerticalNet的研究工程师,在那里他参加了OSM项目,该项目是促进和协调Web Services的基础结构。他作为一名研究工程师在SRI(Stanford Research Institute)International公司开始其职业生涯,从事OAA(Distributed software architecture)项目,并为CHIC! Lab(Computer Human Interface Center)工作,他的研究重点是未来多模式用户界面。他还曾积极参与移动机器人项目,其中机器人被认为是实施团队协作以执行合作任务的物理载体。 |