IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Grid computing  >

商业服务网格,第 2 部分: 实现商业服务网格

用样本方案来说明服务域的创建

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

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 年 6 月 01 日

正如我们在这个系列的第 1 部分中所描述的,服务域通过公共服务入口点表示一组相似或相关的 Web 服务。它应用自主计算原理聚集 Web 服务和网格服务。服务域技术提供了一种服务网格,并且能够自主地创建、过滤、发现、群集、组织、选择、路由、恢复和切换 Web 服务和网格服务。

本文使用了一个样本商业服务网格方案,以演示如何使用服务网格。随后,作者们概述了实现服务域的步骤。本文还包括了对实现的第一步(服务域创建)的详细讨论。

服务网格方案


本节将讨论服务域工具箱(Service Domain Toolkit)中的演示程序,它们展示了服务域如何聚集和有效组织一组用 Web 服务描述语言(WSDL)定义的服务。 Web Services Toolkit V3.3中包括了服务域工具箱。

这些演示程序以及本文中的服务网格方案的重点在于 中心服务域,该服务域担任一组相关服务的服务访问入口点。入口点是提供者注册其服务的地方,也是提供者通过实例化 ServiceHub 对象构建服务域体系结构的地方。该中心被设置为缺省策略,即根据所提供的服务功能采取不同的供应者服务级别。它根据使用合同将用户划分为金银铜三个级别。每个级别都映射到处于同一供应者服务级别的供应者服务实例池。用户可以使用根据使用服务级别授权的服务功能。该中心将使用几个选择规则,从适用的池中选择实例来为入站请求服务,如图 1 所示。


图 1. 服务中心方案
服务中心方案

本方案所包括的角色有中心拥有者、服务提供者和服务请求者。注意这些术语是用在 Web 服务方面的,而不是一般意义上 xSP 的“提供者”。术语“所提供的服务”是指网格或类网格环境中的所有后端服务实例。请求者是指向网格发送服务请求的用户或程序。服务请求是指 Web 服务操作,也被称为服务“功能”。合同是指网格和请求者(或网格和提供者)之间任何形式的服务级别协定(SLA)。

服务提供者


服务提供者提供将要被聚集到服务中心的服务,并负责将其服务注册到中心。例如,Web Services Toolkit V3.3 中的 servicedomain 演示程序展示了一个中心,该中心最初创建了两个 portType: stockquoteaddressbook 。它们都是 ServiceDesk 对象,各表示一组相似服务:StockQuoteService 和 AddressBookService。

服务提供者会将所提供的服务注册到中心,中心则自动将它们注册到相似的 portType 下。反过来,也可以注销所提供的服务。注册和注销服务将引起在服务域的服务实例列表中添加或删除服务实例。服务提供者会从中心提供的供应者服务级别中进行选择,来注册其服务实例。提供者不会选择支持哪种用户服务级别。中心会将该关系作为其策略设置的一部分进行映射。

服务域拥有者和管理员


中心拥有者要负责:
  • 设置操作策略并监控中心的行为,包括注册和注销所提供的服务实例
  • 维护其对服务质量的控制
  • 执行手工故障转移处理

可以通过设置策略规则(包括服务选择)、服务映射、事件处理等来控制中心的操作。我们的方案使用了一组简单的选择规则(随机、循环和指定等)来展示服务域体系结构的服务分派功能的灵活性。中心提供了服务级别定义,作为生成使用合同和供应者合同的模板。合同的耦合是通过策略设置完成的。该方案对策略设置了缺省配置。它显示一些用户服务级别,这些级别作为缺省映射的结果受到每个已注册的服务实例的支持。

服务请求者


服务请求者是服务域的用户。正如先前提到的,演示程序提供的缺省使用合同将用户划分为金银铜三个级别。每个用户都可以使用根据其服务级别所授权的服务功能。
金级用户
可以使用 getStockQuoteMultiple 请求。该请求将从一列预先配置的代号返回多个股票的报价,并带有描述性信息。
银级用户
不能使用 getStockQuoteMultiple 请求。但可以使用 getStockQuoteSingle 请求,该请求从一个预先配置的代号返回单个股票的报价。同时包括描述性信息。
铜级用户
只能使用 getStockQuoteSingle 请求,并且不返回描述性信息。
该演示程序提供了多个并发用户请求的批处理方式模拟。根据当时所使用的选择规则,将以随机、循环、固定或指派等次序选择所提供的服务实例。用户也可以从 addressbook portType 请求服务,这会导致以相似的方式在已注册的 AddressBookService 实例中进行选择。

总之,服务域演示程序所提供的样本方案是一个 ServiceHub 对象,它包含两个用不同的 portType 表示的初始 ServiceDesk 对象。尽管演示程序中没有进行展示,但在注册新的服务接口时, ServiceHub 对象会自动生成新的 ServiceDesk 对象和 portType。在实际情况中,这些应该是特定于客户的 Web 服务或网格服务抽象。在下一节中,我们将进一步扩展这个方案,并用演示程序中的样本代码段展示如何使用工具箱。





回页首


使用服务域实现服务网格


工具箱所提供的用于服务域的主要处理步骤是:

服务域创建
服务域是通过对与工具箱一起提供的基本服务域对象进行实例化或继承而创建的。
服务域准备
服务域操作逻辑是用服务策略规则初始化的。“服务级别定义”定义了服务域提供给用户的服务级别,以及它期望从其供应者获得的服务级别。服务选择规则用于选择服务实例以分派入站请求。安全性过程用来了解请求者的身份和访问权。恢复操作用于意外错误,而事件处理程序用于响应被监控的事件。
服务域部署
服务域本身是 Web 服务或网格服务,因此必须遵循主管平台所提供的部署模型;通常,要创建和部署 Web 服务部署描述符(WSDD)及 Web 应用程序 WAR 和 EAR 文件。
所提供服务的拥有者(提供者)注册
所提供服务的拥有者(提供者)使用用于供应者的服务级别定义与服务域签订一份或多份合同,这些服务级别定义是在服务域准备阶段作为合同模板创建的。所提供服务的拥有者在模板中填入具体值,并在对服务域的注册操作调用中(以服务级别定义格式)将它返回到服务域。
创建使用合同
用户组拥有者或管理员代表用户与服务域签订一份或多份合同。在服务域准备阶段创建的用户服务级别定义作为合同模板使用。拥有者或管理员在模板中填入具体值,并在对用户组供应实用程序的调用中(以服务级别定义格式)将它直接返回到服务域。这个过程可以通过主管服务域的服务预订和用户登记系统作为前端。
操作阶段
服务域请求是使用 Web 服务或网格服务接口调用的,该接口调用到服务域的 Java 类方法、JAX-RPC 接口、Web 服务调用框架(Web Services Invocation Framework,WSIF)接口或直接的 Java 调用中。服务域使用从服务策略、服务映射、使用合同和提供者合同中抽取的信息来选择分派给该请求的服务实例。服务分派是可选的。在面向注册中心或服务介绍的服务域(如资源分配服务)案例中,它可能没有被激活。
下一节将详细讨论服务域创建。其余的实现步骤将在本系列以后的文章中讨论。





回页首


服务域创建


服务域是通过对与工具箱一起提供的基本服务域对象进行实例化或继承而创建的。

实例化 ServiceDesk 对象


ServiceDesk 对象是一种 Web 服务描述语言(WSDL)服务,表示作为一组服务的网格基本单元,这些服务本身也可以是 ServiceDesk 。实例化或继承该对象以形成服务集单元,以支持特定于应用程序或系统的域,并提供一组从它所表示的集合中聚集的操作。 ServiceDesk 能够对 ServiceDesk 中的服务实例进行访问、过滤、注册、选择、列出;设置 QoS/SLA 和策略特性;监控以及通知有关这些实例的事件。

下列样本中, StockQuoteServiceDesk 对象继承了 ServiceDesk 对象:

清单 1. 继承 ServiceDesk 对象


import com.ibm.edge.webservices.systemservices.servicedesk.ServiceDesk;

        
public StockQuoteServiceDesk extends ServiceDesk { public StockQuoteServiceDesk() throws Exception { super(); 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"; ServiceInfo info; info = new ServiceInfo("", serviceName, wsdlIntURL, wsdlImplURL, nameSpace, portName, endPointAddress, "Stock Quote Service Desk", "I provide Stock Quotes"); super.setServiceInfo(info); } }

ServiceDesk 对象需要提供代理 portType 和操作,以接收所有发往 ServiceDesk 的入站服务请求。可以考虑使用处理程序或过滤器来代替特定的代理 portType 和操作。而另一方面,这种需求取决于 ServiceDesk 将提供服务的范围。如果仅用于少量操作,则这种需求可能是不必要的。

StockQuoteServiceDesk 中的下列样本代码将服务请求重定向到 ServiceDesk 对象的选择和分派( InvokeOperation )点,该对象将找到请求,并分派到具体的服务实例:

清单 2. 重定向服务请求


public class StockQuoteServiceDesk extends ServiceDesk {
   . . . . . . . .
   . . . . . . . .
        public String getQuoteDescriptive(String session, String arg)
   throws Exception
  {
    ResponseContext result = InvokeOperation(session,          "getQuoteDescriptive",
                               new Object[] { arg });
    return (String)result.getResult();
  }
  
  public String getQuoteSingle(String session, String symbol)
    throws Exception
  {
    ResponseContext result = InvokeOperation(session, 
      "getQuoteSingle", new Object[] { symbol });
    return (String)result.getResult();
  }
  
  public String getQuoteMultiple(String session, String[] symbols)
    throws Exception
  {
    ResponseContext result = InvokeOperation(session, 
      "getQuoteMultiple", new Object[] { symbols });
    return (String)result.getResult();
  }
        . . . . . . . . 
        . . . . . . . .
}


                

我们提供了一个 SDgen 实用程序,用来生成聚集了多个操作的具体 ServiceDesk。假定 ServiceDesk 希望向其客户提供一组操作(作为 WSDL 或作为 Java 接口),那么该程序将生成支持这些操作的 ServiceDesk 对象。

下列样本代码通过 StockQuoteService 操作的 Java 接口声明生成了一个 StockQuoteServiceDesk 对象:

清单 3. 生成 StockQuoteServiceDesk 对象


SDgen.bat -i StockQuoteService -o StockQuoteServiceDesk -m StockQuote -p
StockQuoteServiceDeskPolicy.xml -s stockquoteservicedesk.properties

        
Where the StockQuoteService Java interface for the operations is:
public interface StockQuoteService { public String getQuoteDescriptive(String symbol); public String getQuoteSingle(String symbol); public String[] getQuoteMultiple(String[] symbol); }
assumes the following:
a. a service policy file, StockQuoteServiceDeskPolicy.xml, exists. b. stockquoteservicedesk.properties can be found in the classpath at run time. c. the properties file, stockquoteservicedesk.properties, contains the following properties:
####################################################### # Sample properties file for setting service info for # a sample service desk # The properties SERVICE_NAME, SERVICE_IMPL_WSDL_URL, NAME_SPACE # and SERVICE_PORT_NAME are mandatory. The rest are optional. # SERVICE_NAME=StockQuoteServiceDesk SERVICE_INTERFACE_WSDL_URL=http://localhost:80/wstk/StockQuoteServiceDesk/ StockQuoteServiceDesk_Interface.wsdl SERVICE_IMPL_WSDL_URL=http://localhost:80/wstk/StockQuoteServiceDesk/ StockQuoteServiceDesk_Impl.wsdl NAME_SPACE=http://StockQuoteServiceDesk SERVICE_PORT_NAME=stockquoteservicedesk ENDPOINT_ADDRESS=http://localhost:80/wstk/services/stockquoteservicedesk PROVIDER_NAME=StockQuoteServiceProvider PROVIDER_DESCRIPTION=ProvideStockQuotes note: SDgen creates the Java class StockQuoteServiceDesk in the same package as the interface file (in this example, StockQuoteService). If the package name is not specified, it is generated in package com.ibm.edge.applications Compile the generated Java class. Run WSTK's Java2WSDL utility program to generate a WSDL for the new service desk. Place this properties file in the webapp's classes directory so that the service desk can find it at run time.

实例化服务中心对象


ServiceHub 对象是一种表示一组 ServiceDesk 或 ServiceHub 的 WSDL 服务。对它进行实例化或继承,以形成支持特定于应用程序或系统的域的中心。除了还提供自动的服务组合功能之外,它所提供的能力与 ServiceDesk 所提供的相同。注册时,它将具有相同接口定义的服务实例自动组合到中心的一个公共 portType 中。

下列样本代码继承了 ServiceHub 对象:

清单 4. 继承 ServiceHub 对象


   public class MyServiceHub extends ServiceHub {


  
        
          /**
   *  Instantiates an instance of MyServiceHub
   *  
   */
        

  public MyServiceHub() throws Exception
  {
    Super();
  
        
          //  set service information here 
        
  } 
    }

                
      

处理程序或过滤器的使用可以提供专门服务,以定向所有发往 ServiceHub 的入站服务请求,而无需中心实现代理 portType 和操作。这种需求取决于中心的服务作用域。如果它是通用的服务中心实现类,那么这种需求可能是不必要的。

“MyServiceHub”示例可以使用前面描述的用于 StockQuoteServiceDesk 对象的相同方法,以设置代理操作并将服务请求重定向到 MyServiceHub 的选择和分派(InvokeOperation)点。但是,对于经常生成动态 portType 和接口的中心而言,这种方法可能不是很有效。下列样本代码提供了另一种方法 ? 在中心之前使用轴处理程序,以自动捕获服务请求:

清单 5. 另一种方法


public class MyServiceHubHandler extends JavaProvider {
  . . . . . . . .
  . . . . . . . .
  /**
   * Redirect specific service request operation/method calls to a 
   * call to the
   * common receiving method "invokeOperationWithQos" of the hub.
   */
   public void processMessage(
        MessageContext msgContext,
  SOAPEnvelope reqEnv,
  SOAPEnvelope resEnv,
  Object obj)
  throws Exception
        {
        
        
          // process handler specific parameters from msgContext
              . . . . . . . .
           // process portname
        
                String portname = msgContext.getTargetService();
            
       
        
          // process operation/method name and arguments from reqEnv
        
              Vector       bodies = reqEnv.getBodyElements();
              RPCElement   body = null;

              for (int bNum = 0; body == null && bNum <  bodies.size(); 
                 bNum++ ) 
              {
           body = (RPCElement) bodies.get( bNum );
              }

    if (body == null) {
            throw new Exception();
    }
      
        String methodName = body.getMethodName();
                Vector args = body.getParams();
    Object [] newArgs = convertParams(portname, methodName, 
       newArgs);

    
        
          // call hub object
        
    JavaClass jc = JavaClass.find(obj.getClass());
    Method method = jc.getMethod("invokeOperationWithQoS");
    return method.invoke(obj, newArgs);

        } 

        protected Object[] convertParams(
                String port,
                String method,
                Vector args)
        {
             
        
          // insert portname and method name to the arguments 
                   and convert to array
        
  }
    . . . . . . . .
    . . . . . . . .
}

                
      

实例化 RegistryDiscoveryDomain 对象


RegistryDiscoveryDomain 对象是一种充当通用服务注册和发现域的 WSDL 服务。可以将它实例化或继承为可通过服务注册和发现方法访问的服务注册中心。该域提供了用于在域综合体中注册、列出和发现服务实例的能力。可以继承它以形成服务注册和发现域网络,以支持跨综合体的服务注册和发现的需求。

下列样本代码继承了 RegistryDiscoveryDomain 对象:

清单 6. 继承 RegistryDiscoveryDomain 对象


public class MyRegistryDiscoveryDomain extends RegistryDiscoveryDomain {

  /**
   *  Instantiates an instance of RegistryDiscoveryDomain
   *  
   */

  public MyRegistryDiscoveryDomain() throws Exception
  {
    Super();
  
        
          //  set service information here
        
  } 
}

                
      

初始化服务域状态


服务域的初始状态是由 setServiceInfo 操作设置的,或者是从运行中的注册中心通过 getServiceInfo 装入的。服务域会自动将它本身注册到与该域关联的私有注册中心。上述来自于 StockQuoteServiceDesk 的样本代码段通过 ServiceInfo 对象来启动其状态。

下列样本代码通过保存在私有注册中心中的当前信息来启动 MyServiceHub 的状态。

清单 7. 启动 MyServiceHub 的状态


ServiceHub MyServiceHub; 
        
          // instance of a resumed service, 
   MyServiceHub 
        
String akey;            
        
          // service instance key from the previous 
   run 
        

MyServiceHub.getServiceInfo(akey);

                
      

通过编辑 operationsServices.properties 文件以添加用户方式并将服务域设置成使用这些方式,从而将服务域想要存储其状态的地方与其它域隔离开。下列样本特性代码定义了一种用于保存 MyServiceHub 状态的 MyHub 方式:

清单 8. 样本特性



        
        
          #########################################################
# data files for user defined mode, e.g. MyHub
# the paths are all relative to WSTK's source directory (this is 
# how wstk folks do it)
#
# files for ServiceDesk Domains
# file used by listing to store information about suppliers
        
MyHub.listingProviderFileName=/services/demos/servicedomain/myhub/
   providers.xml


        
          # file used to store information about user sessions 
        
MyHub.sessionsFileName=/services/demos/servicedomain/myhub/sessions.xml


        
          # file used to store provider SLAs
        
MyHub.providerSLAFileName=/services/demos/servicedomain/myhub/
   providerSLA.xml


        
          # file used to store provider specific information for cloning
        
MyHub.cloneDataDir=/services/demos/servicedomain/myhub/cloneData


        
          #
# additional files for ServiceHub Domains
#  file containing the default master policy file for the service
    hub
        
MyHub.masterPolicyFileName=/services/demos/servicedomain/myhub/
   masterpolicy.xml


        
          # file to store meta data for service groups
        
MyHub.groupSetFileName=/services/demos/servicedomain/myhub/groupset.xml


        
          # log file used by the log handler MyHub.logFile=/services/demos/
   servicedomain/myhub/logfile.txt
        
      
                
      

下列代码段将设置 MyServiceHub,以在 MyHub 方式所指示的正确位置存储和检索状态:

清单 9. 设置 MyServiceHub 以存储和检索状态


      

ServiceHub MyServiceHub;    
        
          // instance of MyServiceHub
          

MyServiceHub.setMode("MyHub");  
        
          // set property mode
        
      
                
      





回页首


结束语


我们提供了一个样本商业服务网格方案,以展示如何使用服务网格。我们对实现服务域所需的步骤进行了简要概述,并详细讨论了实现的第一步:服务域创建。

完成这一步之后,我们创建了一个逻辑服务,它准备用于保存一组自动添加的服务实例。我们如何使这个集合表现得象一个服务,如何教会服务使用规则以使集合自动操作,如何扩展其能力以及与其它集合链接起来?请关注本系列。本系列的下一篇文章将详细讨论服务域准备,这是服务域处理的下一步。



参考资料



作者简介

作者

Yih-Shin Tan 是 IBM Software Group 的高级技术人员。他的专业领域包括基于 Web 的系统软件体系结构、分析、设计和开发,另外他已经成为新兴技术的前沿开拓者。目前,他是 WebSphere 平台系统系列高级设计和开发(WebSphere Platform System House Advanced Design and Development)组织的 Web 服务和网格计算集成技术的首席架构设计师。他曾经协助开发了作为 IBM alphaWorks 上的技术概念演示的服务域工具箱。可通过 ystan@us.ibm.com与 Yih-Shin 联系。


作者

Brad Topol 是 IBM 位于北卡罗来纳州 Research Triangle Park 的高级软件工程师,他在 WebSphere 平台系统系列高级技术(WebSphere Platform System House Advanced Technology)部任职。他于 1998 年获得佐治亚州理工学院的计算机科学博士学位。目前,他正积极地参与 Web 服务、网格计算、OGSA 和自主计算等领域的高级技术项目。可通过 btopol@us.ibm.com与 Brad 联系。


author

Vivekanand Vellanki 参与了 Web 服务、网格计算和自主计算领域的高级技术项目。他于 2001 年获得佐治亚州理工学院的计算机科学博士学位。他的兴趣包括计算、Web 服务器和对等计算。可通过 vellanki@us.ibm.com与 Vivek 联系。


author

Jie Xing 是一位顾问软件工程师,他已经在 IBM 位于北卡罗来纳州的 Research Triangle Park 工作了一年半时间。目前,他参与了 Web 服务、网格计算和自主计算领域的高级技术项目。他于 2000 年获得北卡罗来纳州立大学计算机科学运筹学博士学位,他的研究兴趣包括多代理系统、分布式系统和工作流。可通过 jiexing@us.ibm.com与 Jie 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款