级别: 初级 Yih-Shin Tan (ystan@us.ibm.com), 高级技术人员 Brad Topol (btopol@us.ibm.com), 高级软件工程师 Vivekanand Vellanki (vellanki@us.ibm.com), 顾问软件工程师 Jie Xing (jiexing@us.ibm.com), 顾问软件工程师
2004 年 7 月 01 日 服务域代表可通过公共服务入口点访问的一组具有可比性的或相关的 Web 服务。它将自主计算的原则应用于 Web 服务和网格服务的集成上。服务域技术提供了一种服务网格,可以自动创建、过滤、发现、集群、组织、选择、路由、恢复和切换 Web 服务与网格服务。
这个系列的
第 1 部分描述了服务域如何通过公共服务入口点来体现一组具有可比较的或相关的 Web 服务,并将自主运算的原则应用于 Web 服务和网格服务的集成上。
第 2 部分通过一个商业服务网格样例,概括性地介绍了实现服务网格的方法,并详细讨论了服务域的创建方法。
第 3 部分展示了如何配置策略文件,使之适应服务域的不同方面,如服务级别定义、服务选择、安全性、错误恢复、事件监视和服务映射等。
第 4 部分展示了如何将服务域部署到几种不同的平台上,如 Web Service Toolkit 1.0、Web Service Bus 框架、WebSphere Application Server 5.0 等。同时,作者还描述了如何为公共注册机构,如 UDDI 注册机构和 OGSA 兼容注册机构注册服务域。现在是本系列的第 5 部分,我们将讨论如何为服务域注册服务,以及如何将这些服务的集合提供给客户机。
简介
在面向服务的体系结构(Service-oriented Architecture,SOA)中,服务域的主要作用是为多个服务提供者创建服务代理。主服务域将自身建立为由多个服务实例组成的虚拟服务的单个逻辑映像。比如说,某金融服务域为了满足订货方提出的条款(Terms and Conditions,T & Cs),可以在供货方和多个机构清算抵押贷款额度。
虽然服务域逐渐成为日常生活的必需,但是正像很多业主在运行商店、餐馆、企业等业务中所做的那样,为客户和供应商建立一个坚实的基础依然很重要。成功的业主会从可靠的供应商那里采购物品,并用自己的商标进行包装,同时还要保证提供服务和质量的等级。服务域服务域通过购物清单的方式招集有资格的服务提供者,然后用服务菜单吸引用户去使用。
在
第 3 部分 中,我们谈到服务级别,它定义了服务域提供服务种类,以及需要找到什么样的服务提供者。在下面几节中,我们将讨论服务注册和请求者订阅等话题。
服务注册阶段
服务注册阶段负责将提供者的服务注册到服务域中。服务的所有者(即服务提供者)与服务域签订一项(或者多项)契约,契约的模板是在服务域的准备阶段为供应商创建的服务级别定义。服务所有者负责填写模板中特定的内容,然后通过对服务域的注册操作调用将其(以服务级别定义的格式)返回给服务域。下面的例子代码展示的是一名股票报价服务提供者填写好的服务级别模板,它将自己登记为首席(PREMIER)供应商:
<service_level_agreement type="SUPPLIER">
<servicelevel name="PREMIER" feebase="FeeBase" qos="Category5">
<operation name="getQuoteMultiple" />
<operation name="getQuoteDescriptive" />
<operation name="getQuoteSingle" />
</servicelevel>
<qos name="Category5">
<attribute name="AVAILABILITY" value="100" />
<attribute name="RESPONSIVENESS" value="1" />
<attribute name="MAX_LOAD" value="600" />
<attribute name="TIME_OUT" value="99" />
</qos>
</service_level_aggeement>
|
这意味着提供者将自身提交为首席供应商。PREMIER 服务级别是由服务域定义的,它要求提供者支持 QoS 级别 Category5 中列出的三种操作,以及 FeeBase 服务收费方法。除可选的 QoS 属性以及可变属性的值之外,其他的值都是固定的。比如说,在可用性要求超过 95% 的地方,提供者可将其指定为 100%。
注册服务实例
为了和服务域签订契约,服务实例需要用自身的 WSDL 句柄、所选的服务级别、服务属性的信息注册到服务域中。应该从具有所有服务实例权限的应用程序执行这个过程。用下面的样例代码段可以向 StockQuoteServiceDesk 注册 SQServiceAService:
String sessionid;
// session id obtained from previous access validation
String slData;
// service level data in xml format
QName serviceQName;
QName portQName;
// prepare information needed for service domain access
String wsdlImplURL =
"http://localhost/wstk/servicedomain/StockQuoteServiceDesk_Impl.wsdl";
String wsdlIntURL =
"http://localhost/wstk/servicedomain/StockQuoteServiceDesk_Interface.wsdl";
String serviceName =
"StockQuoteServiceDeskService";
String nameSpace =
"http://StockQuoteServiceDesk";
String portName =
"stockquoteservicedesk";
String endPointAddress = "http://localhost/wstk/services/stockquoteservicedesk";
// prepare provided service information for registering
String reg_wsdlImplURL =
"http://provider/wstk/servicedomain/SQServiceA_Impl.wsdl";
String reg_serviceName =
"SQServiceAService";
String reg_nameSpace =
"http://SQServiceA";
String reg_portName =
"sqservice";
serviceQName = new QName(namespace, serviceName);
portQName = new QName(namespace, portName);
Service service = new Service(new URL(wsdlImplURL), serviceQName);
Call call = (org.apache.axis.client.Call)service.createCall(portQName,
"Register");
String servicekey = (String)call.invoke(
new Object[] { sessionid, reg_wsdlImplWSDL, reg_namespace,
reg_serviceName, reg_portName, slData });
|
提供者现在将自身提交为 PREMIER 供应商。其他供应商也可以用相同的方式注册,不过服务的级别可能不同。它们所提供的仅仅是服务域所需要的服务。然后,服务域会将所有的服务打包,并添加自己的 T & C 中的服务和质量特性,供服务请求方订阅。
供应方的服务级别定义和契约编写工具
我们可以提供服务级别定义和契约编写工具,用于为服务域创建服务级别定义,以及生成提供方的契约。编写工具应该提供交互式的对话框,用它指引提供者(服务的所有者)创建契约。创建好的契约可以保存在其他地方,然后可以在运行期间将它关联到服务域的服务级别定义中。
ETTK 1.0 中的随需而变服务网格解决方案演示为供应方提供了生成服务定义和契约的用户界面。
捆绑不同类型的服务
服务可以在不同的标准协议之下得以实现。服务必须使用特定的绑定机制么?不用,服务域可将绑定机制识别为服务的属性,在注册完毕之后也可以设置它。可以对服务类型属性进行设置,以便控制按照适当的服务类型分发服务实例,如 SOAP、WSIF、网格、文档类等。
下面的代码段将“hub”域中某个服务实例的服务类型从 key 设置为“SOAP RPC”。
ServiceHub hub; //ServiceHub instance obtained
String sessionid; // previously obtained sessionid
String key; // supplier's key obtained using the Register call
String service_type_sde =
"<Attributes>" +
"<serviceType value ='SOAP_RPC' />" +
"</Attributes>"; // xml string that defines a service type of the
supplier to SOAP RPC"
hub.setServiceInfo(sessionid, "byKey", key, service_type_sde, null);
// set the service type of the supplier to SOAP RPC
|
综合服务
对服务级别的认同同时意味着认同该级别的服务接口定义。服务域的所有者应该为感兴趣的服务提供者提供公共的服务接口定义作为参考实现,因为他们可能希望在多个地点开展自己的服务。有了这种方法,他们只需要提供不同的接口定义即可。
在另一种情况下,如果需要不同的接口定义,则可以使用转换服务。工具箱中提供了一个简单的转换工具类,它可将通用服务域接口映射为不同服务实例所提供的不同操作和消息格式。服务实例提供者可以注册一个扩展下述工具类的转换类:
import com.ibm.edge.webservices.systemservices.domainservice;
/**
* This class implements the mapping of service desk operations to
* a provider's operations.
*
*/
public class Transform {
/*
* An empty constructor is needed.
*/
public Transform() {
}
/*
* Default mapping for an operation name. No change.
*/
protected String mapOperation(String operation) {
return operation;
}
/*
* Default mapping for the input parameters of an operation. No change.
*/
protected Object[] mapInput(String operation, Object[] input) {
return input;
}
/*
* Default mapping for the result of an operation. No change.
*/
protected Object mapOutput(String operation, Object output) {
return output;
}
}
|
服务域可以表现为综合多种端口类型的大量服务。每一种端口类型都代表一个服务接口定义。当服务注册到服务域中时,可将端口类型名称指定给接口。如果服务本身是另外一些服务的服务,如 ServiceDesk 或 ServiceHub 对象,那么就不需要指定端口类型名。
现在,我们的服务域中已经有几个可供请求的端口。每一个端口可有多个符合公共服务接口定义的实现实例。服务的注册并非任意的。它们必须遵守服务域的 T&C。当服务域对供应者提供保护之后,就将注意转移到吸引服务用户上来。接下来,我们将探讨请求者契约的创建和订阅阶段。
使用契约的创建阶段
就像提供者注册为多个服务级别一样,请求者也可以订阅多个使用级别。这是在特性与费用、组织优先权与随机选择之间的权衡,同时也希望获得更好的商业管理能力。在注册足够多的服务之后,服务域就进入了请求订阅阶段。
用户组所有人或管理员根据用户的请求,与服务域签署一项(或者多项)契约。服务域准备阶段创建的用户服务级别定义被用作契约模板。所有人或管理员填写模板中的特定值,然后在用户组准备机制的调用中直接将契约(按照服务级别定义的格式)传递给服务域。这个过程可以通过服务订阅和服务域的宿主环境中的用户注册系统转换到前端。
下面的例子代码展示了用户组管理员填写完毕并返回的服务级别模板,它所请求的用户服务级别为 GOLD:
<service_level_agreement type="USER">
<servicelevel name="GOLD" feebase="feebase1" qos="BEST">
<operation name="getQuoteMultiple" />
<operation name="getQuoteDescriptive" />
</servicelevel>
</service_level_agreement>
|
下面的用户配置文件示例定义了一名 GOLD 用户,其身份标识的值可用于在契约知识库中与使用契约关联起来。
<profiles>
. . . . . . . .
<member id="gold-user"
type="com.ibm.services.profile.PersonData">
<memAttr name="accountName">
<value>GOLD</value>
</memAttr>
<memAttr name="userid">
<value>GOLD</value>
</memAttr>
. . . . . . . .
<memAttr name="id">
<value>gold-user</value>
</memAttr>
. . . . . . . .
<memAttr name="passwd">
<value>GOLD</value>
</memAttr>
. . . . . . . .
</member>
. . . . . . . .
</profiles>
|
下面的代码实例描述了与上面的配置文件中定义的 GOLD 用户标识相关联的使用契约:
<contracts>
. . . . . . . . .
<usagecontract contractkey="gold-0109-4e57-9e88-170b0f3f2568"
identitykey="gold-user"
paymentkey="CCpayment"
start="2001-01-01 00:00:00.0" end="2002-12-3123:59:59.999999999"
identitysig="" identitycert=""
providersig="" providercert=""
providercontractkey="10f5311c-010f-45bd-911c-26ee25a208f1"
ratingkey="rating1">
<attribute name="qos" value="goldQos" />
</usagecontract>
. . . . . . . . .
</contracts>
|
服务域订阅和宿主环境服务提供者的用户注册
服务订阅和用户注册系统为服务域提供了一种理想的服务宿主环境。由于服务域本身也是 Web 服务和网格服务,因此它们可以与提供服务的应用程序集成为一体。可以通过 getServiceInfo 服务域操作编程获得服务域信息,对服务域的服务请求也可以通过 Web 服务或 Java 类调用实现。服务域为插入自定义宿主环境提供了接口。
使用服务级别定义和契约编写工具
我们可以提供服务级别定义和契约编写工具来创建服务级别定义,生成用户端的服务域契约。编写工具应该提供交互式对话框,指导用户组管理员(或用户组)创建契约。契约可以保存在其他的地方,并在运行期间关联到服务域的服务级别定义中。
ETTK 1.0 的随需应变服务网格解决方案演示中提供了为用户组生成服务定义和契约的用户界面。
结束语
本文阐述了如何注册服务、如何集成服务和如何创建请求者需要使用的对象。下一篇文章将开始讨论服务域的运行阶段,其中包括在请求端调用服务域和在供应端相应请求等多个话题。两者之间是用于管理服务的代理函数,如服务信息、策略、服务监视与通知等的 set 和 get 方法。操作阶段支持服务域作为代理与服务请求者和服务提供者进行交互。我们将从解决方案的角度更为详细讨论这些话题。
很多商业和企业团体都有可行的共享机制,但并不容易实现。我们可以在现有基础上做得更好。面向服务的体系结构和 Web 服务是很有希望的技术。软件组件可以商品化,提供请求者和提供者需要的商业功能。服务域提供了一个具体的代理中间件实例,用它来完成服务共享和集成一些特定步骤。按照服务域的概念,SOA 应用程序的实现将更加迅速和简便。
参考资料
作者简介  | 
|  | Yih-Shin Tan 是 IBM Software Group 的高级技术人员。他的专业领域包括基于 Web 的系统软件体系结构、分析、设计和开发,而且他已经成为新兴技术的前沿开拓者。目前,他是 WebSphere 平台系统系列高级设计和开发(WebSphere Platform System House Advanced Design and Development)组织的 Web 服务和网格计算集成技术的首席体系架构设计师。他曾经协助开发作为 IBM alphaWorks 上的技术概念演示的服务域工具箱。可通过
ystan-at-us.ibm.com 与 Yih-Shin 联系。
|
 | 
|  | Brad Topol 是 IBM 位于美国北卡罗来纳州 Research Triangle Park 的高级软件工程师,他在 WebSphere 平台系统系列高级技术(WebSphere Platform System House Advanced Technology)小组任职。他于 1998 年获得佐治亚州理工学院(Georgia Institute of Technology)的计算机科学博士学位。目前,他正积极地参与 Web 服务、网格计算、OGSA 和自主计算等领域的高级技术项目。可通过
btopol-at-us.ibm.com与 Brad 联系。
|
 | 
|  | Vivekanand Vellanki 参与了 Web 服务、网格计算和自主计算领域的高级技术项目。他于 2001 年获得佐治亚州理工学院的计算机科学博士学位。他的兴趣在于分布式计算、Web 服务器和对等计算。可通过
vellanki-at-us.ibm.com与 Vivek 联系。
|
 | 
|  | Jie Xing 是一位顾问软件工程师,他已经在 IBM 位于美国北卡罗来纳州 Research Triangle Park 工作了一年半。目前,他正参与 Web 服务、网格计算和自主计算领域的高级技术项目。他于 2000 年获得北卡罗来纳州立大学(North Carolina State University)计算机科学运筹学博士学位,他的研究兴趣涉及多代理系统、分布式系统和工作流。可通过
jiexing-at-us.ibm.com与 Jie 联系。
|
对本文的评价
|