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

developerWorks 中国  >  Grid computing  >

商业服务网格,第 3 部分: 设置规则

服务域策略配置

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), 顾问软件工程师

2003 年 4 月 01 日

在本文中,作者们展示了如何为服务域的几个方面配置策略文件,这些方面包括:服务级别定义、服务选择、安全性、错误恢复、事件监控和服务映射。

本系列的 第 1 部分描述了服务域是如何通过公共服务入口点表示一组相似或相关 Web 服务的。它应用自主计算原理聚集 Web 服务和网格服务。服务域技术提供了一种服务网格,并且能够自主地创建、过滤、发现、群集、组织、选择、路由、恢复和切换 Web 服务和网格服务。第 2 部分使用一个样本商业服务网格案例,概述了服务网格的实现,并详细讨论了服务域的创建。

简介


美食店的厨师、旅馆的服务人员、连锁零售商店的供应商、来自 Web 站点的商业服务和一系列服务器有什么共同点呢?是的 ? 他们都将服务作为其业务单元的一个完整部分来提供,遵从由单位的领导设置的规则和命令,自动响应工作命令并将异常留给其领导处理。领导们可能会要求其它特殊服务或提出更多的帮助,以保持操作运行。服务域就是这种模型的抽象。服务本身可能各不相同,但是接收工作命令的方式;收集、选择和表示服务的方式;监控和交流状态信息的方式;以及管理异常的方式可以归为几种公共模式。如何设置规则和命令,以便将这些服务作为一个整体单元集中进行操作呢?本文讨论了进行服务域准备的基本原理和思想。





回页首


服务域准备


服务域操作逻辑是用服务策略规则初始化的,这些规则包括以下方面:

  • 服务级别定义 :这些定义被用作模板,以分别在服务域和用户组之间创建使用合同,或在服务域和所提供的服务实例之间创建供应者合同。它们定义了服务域向用户提供的服务级别,以及它期望从其供应者获得的服务级别。
  • 服务映射 :将所提供的服务实例分派给为特定用户服务级别分配的服务池
  • 服务选择规则 :用于选择分派给入站请求的服务实例的规则
  • 安全性过程 :执行请求者认证并向请求者授予访问权限
  • 错误恢复 :说明处理异常错误操作的规则
  • 事件处理 :根据可以监控的特定事件而触发的处理程序
  • 发现、商业标准、杂项规则以及其它更多规则 :将来会添加此类工具,请保持关注

服务策略是通过 Web 服务或 Java 调用,使用服务域操作(API)以编程方式设置到服务域的。下面的样本代码为 StockQuoteServiceDesk 对象设置了服务策略。


String sessionid; 
        // session id obtained from previous access 
    validation
String policyData;  
        // policy data in xml format

Service service;
Call call;

QName serviceQName;
QName portQName;
   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";

serviceQName = new QName(namespace, serviceName);
portQName = new QName(namespace, portName);

service = new Service(new URL(wsdlImplURL), serviceQName);
call = (org.apache.axis.client.Call)service.createCall(portQName, 
    
        "setPolicy");
call.invoke(new Object[] { sessionid, policyData });

                
      





回页首


为预制域设置服务策略


预制域已经为插入特定的服务实例准备就绪,在这些实例中策略设置将决定服务域为用户代理服务的能力。当配置规则时,在添加用于扩展事件处理程序部分的操作控制和定制的其它规则之前,请先考虑从服务级别定义、服务映射和服务选择开始的策略流。将来会对安全性过程和恢复操作这两部分进行扩充。

最好通过在一些锚对象(通常是顶级节点)上设置策略来处理嵌套的服务域。 ServiceHub 所包含的 ServiceDesk 将自动地共享为前者设置的服务策略。也可以显式地为嵌套的 ServiceHub 或 ServiceDesk 设置策略。调用域可以通过使用 setPolicy 操作来操作个别域的规则,从而能够控制共享。 RegistryDiscoveryDomain 总是带有一个缺省策略,该策略假定它本身是一个无限制的、通用的、公众可访问的域。

下列样本代码为服务域的独立演示程序所使用的 ServiceHub 对象设置了一段服务策略。 ServiceHub 下嵌套的两个 ServiceDesk 对象共享了该策略,以提供股票报价和地址簿服务。


       <?xml version="1.0" encoding="US-ASCII"?>

       <serviceDeskPolicy>
          <service_levels-section type="USER" >

             <servicelevel name="gold" feebase="feebase1" qos="BEST">
                <operation name="getQuoteMultiple" />
                <operation name="getQuoteDescriptive" qos="BETTER" />
                <operation name="getQuoteSingle" />
                <operation name="addEntry"/>
                <operation name="removeAll"/>
                <operation name="listAll"/>
             </servicelevel>

             <servicelevel name="silver" feebase="feebase2" qos="BETTER">
                <operation name="getQuoteDescriptive" />
                <operation name="addEntry"/>
                <operation name="getAllListings"/>        
             </servicelevel>

             <servicelevel name="bronze" feebase="feebase3" qos="GOOD">
                <operation name="getQuoteSingle" />
                <operation name="getAllListings"/>        
             </servicelevel>
 
          </service_levels-section>

      . . . . . . . . . . . .
      . . . . . . . . . . . . 

       </serviceDeskPolicy>

                





回页首


为服务域设置服务级别定义


服务域分别与用户和供应者(服务供应者)签订合同,因为他们是不同的类型。 用户合同表明服务域向其外部世界提供什么,包括带有服务质量(QoS)特征和使用收费的服务集。 供应者合同表明服务域希望从其供应者得到的东西,包括服务集、QoS 特征以及统一的或基于使用情况的收费需求。但是,服务域对待供应者合同必须比对待用户合同更严格。用户很可能对所得到的服务的功能和成本更感兴趣,对于 QoS 特征,更感兴趣的是定性的内容,而非定量的指标。相反,供应者对于他们需要向服务域提供什么,必须有具体的和量化的理解。

服务域使用服务级别定义作为创建合同的基础。来自于各个专业供应者的服务被聚集起来,就好象它们都来自于该服务域本身一样。这就是服务域如何充当服务代理,以及如何保证它所提供的服务的完整性和质量的方式。下列样本代码为使用来自 ServiceHub 的股票报价服务定义了用户服务级别。


  <service_levels-section type="USER" >

     <servicelevel name="gold" feebase="feebase1" qos="BEST">
        <operation name="getQuoteMultiple" />
        <operation name="getQuoteDescriptive" qos="BETTER" />
     </servicelevel>

     <servicelevel name="silver" feebase="feebase2" qos="BETTER">
        <operation name="getQuoteDescriptive" />
     </servicelevel>

     <servicelevel name="bronze" feebase="feebase3" qos="GOOD">
        <operation name="getQuoteSingle" />
     </servicelevel>

     <qos name="BEST">
        <attribute name="AVAILABILITY" value="95" />
        <attribute name="RESPONSIVENESS" value="1" />
     </qos>

     <qos name="BETTER">
        <attribute name="AVAILABILITY" value="90" />
        <attribute name="RESPONSIVENESS" value="5" />
     </qos>

     <qos name="GOOD">
        <attribute name="AVAILABILITY" value="80" />
        <attribute name="RESPONSIVENESS" value="10" />
     </qos>

  </service_levels-section>


                

下列代码段定义了向 ServiceHub 提供股票报价服务的供应者服务级别。


  <service_levels-section type="SUPPLIER" >
     <servicelevel name="PREMIER" feebase="feebaseA" qos="Catagory5">
        <operation name="getQuoteMultiple" />
        <operation name="getQuoteDescriptive" />
     </servicelevel>

     <servicelevel name="PREFERRED" feebase="feebaseB" qos="Catagory4">
        <operation name="getQuoteDescriptive" />
     </servicelevel>

     <servicelevel name="TRIAL" feebase="feebaseC" qos="Catagory3">
        <operation name="getQuoteSingle" />
     </servicelevel>

     <qos name="Catagory5">
        <attribute name="AVAILABILITY" value="98" />
        <attribute name="RESPONSIVENESS" value="2" />
        <attribute name="MAX_LOAD" value="500" />        <attribute name="TIME_OUT" value="100" />
     </qos>

     <qos name="Catagory4">
        <attribute name="AVAILABILITY" value="95" />
        <attribute name="RESPONSIVENESS" value="2" />
        <attribute name="MAX_LOAD" value="300" />
        <attribute name="TIME_OUT" value="200" />
     </qos>

     <qos name="Catagory3">
        <attribute name="AVAILABILITY" value="85" />
        <attribute name="RESPONSIVENESS" value="5" />
        <attribute name="MAX_LOAD" value="100" />
        <attribute name="TIME_OUT" value="300" />
     </qos>

  </service_levels-section>

                





回页首


设置服务映射


服务域使用服务映射部分来将用户服务级别与供应者服务级别关联起来。下列样本代码定义了映射到用户服务级别的供应者池。它们成为缺省的“亲缘关系组”,可以根据 服务选择规则中的说明,从该组中选择服务。


  <service-mapping-section>
    <servicemap name="default">

      <!--
        Mapping requests from GOLD users to all PREMIER suppliers.
      -->

      <pool name="GOLDSuppliers" user_servicelevel="GOLD"> 
        <condition-set type="or">
           <condition name="supplier_servicelevel" value="PREMIER" />
        </condition-set>
      </pool>

      <!--
        Mapping requests from SILVER users to PREFERRED or TRIAL suppliers.
      -->

      <pool name="SILVERSuppliers" user_servicelevel="SILVER"> 
        <condition-set type="or">
           <condition name="supplier_servicelevel" value="PREFERRED" />
           <condition name="supplier_servicelevel" value="TRIAL" />
  </condition-set>
      </pool>

      <!--
        Mapping requests from BRONZE users to all TRIAL suppliers.
      -->

      <pool name="BRONZESuppliers" user_servicelevel="BRONZE"> 
        <condition-set type="or">
            <condition name="supplier_servicelevel" value="TRIAL" />
        </condition-set>
       </pool>

     </servicemap>
  </service-mapping-section>


                





回页首


为服务域设置服务选择规则


接收到服务请求时,服务域查看与使用合同相关的服务级别设置,并选择一组符合要求的服务实例。根据选择规则规范,并考虑在运行时期间监控的数据,从该组中选择最佳服务实例来为请求服务。选择规则的有序列表会考虑使用合同、服务级别、工作负载预测、服务条件等,并用这些信息构成主选择策略。服务域使用服务选择规则作为起始点,并结合运行时的动态输入来作出选择决策。选择规则是以 <触发器、符合条件、亲缘关系、伪指令> 的形式指定的,这意味着如果触发条件得到了满足,就会检查符合条件以确定亲缘关系组,并使用伪指令从那个组中选择服务实例。

例如,一条规则指定:“上午 8:00 以后,将通过实例 A - Z 以随机方式来为来自美国东部地区的请求提供服务”。下列代码段定义了一些服务选择规则,它们为所有请求 ServiceHub 中的股票报价、地址簿和其它动态注册服务的用户管理了服务实例选择。


<selection-rule-section>
   <trigger-defs>
     <trigger name="AllDay" type="Time">
       <parameter name="start" value="0:0:0" />
       <parameter name="end" value="23:59:59" />
     </trigger>
   </trigger-defs>
   <!--
   For gold users, the following rules governs service selections for
   the entire day.
   -->
   <selection-rule trigger="AllDay">
  <condition-set type="and">
    <condition name="servicelevel" value="gold" />
  </condition-set>
  <action  directive="RoundRobin" />
   </selection-rule>
     
   <!--
   For silver users, the following rule governs service selections for 
   the entire day.
   -->
   <selection-rule trigger="AllDay">
  <condition-set type="and">
    <condition name="servicelevel" value="silver" />
  </condition-set>
  <action  />
   </selection-rule>

   <!--
   For bronze users, the following rules distributes service selections 
   for entire day.
   -->
   <selection-rule trigger="AllDay">
  <condition-set type="and">
    <condition name="servicelevel" value="bronze" />
  </condition-set>
  <action directive="Random" />
   </selection-rule>

</selection-rule-section>

                





回页首


为服务域设置安全性过程


服务域提供了一种简单的登录/注销接口,以在请求者的整个生命周期内维护其状态。它假定其调用者已经完成了安全性验证,但如果使用合同或服务策略要求进行验证,可以通知它使用安全性服务(例如,托管环境或另一个服务域)进行验证。目前,支持下列过程名:

  • Login:通过安全性管理器实现所提供的缺省身份服务的验证
  • Trusted:由调用者对请求者的身份负责
  • General:不需要验证

将来,将会包括一个服务域支持的身份服务列表。下列代码样本定义了服务域的独立演示程序的安全性过程。该演示程序要求登录到实例化的 ServiceHub。


<security-procedure-section>
    <security-procedure name="Login" />
</security-procedure-section>

                

下列代码段将服务域实用程序服务演示程序的安全性过程定义为有效的服务级别,为演示程序而实例化的 ServiceHub 将会接受这个级别。


<security-procedure-section>
    <security-procedure name="AcceptValidServiceLevel" />
</security-procedure-section>

                





回页首


为服务域设置恢复操作


当发生异常时,服务域就执行恢复操作。目前,如果指定了自动操作,那么,恢复过程将从当前分配给使用合同的服务池中选择下一个最佳的服务实例。如果组中的服务实例已经用完,那么该域将在低一级的符合要求的组中重复该过程,直至所有服务实例都已用完。如果出现那种情况,则用一个错误消息通知服务请求者。另一种恢复选项是手工恢复,这意味着将来要添加一个缺省的异常处理程序,以连接到管理控制台。也可以插入定制恢复操作。更细的恢复粒度将取决于如何标准化服务异常。下列代码段将 ServiceHub 的恢复操作定义为自动选择下一个可用的最佳服务实例。


<recovery-action-section>
    <recovery-action name="Automatic" />
</recovery-action-section>

                





回页首


为服务域设置事件处理程序


事件处理程序是一些扩展功能以及扩展与其它服务和资源的互操作性的方法,例如当工作负载超过本身处理能力时激活更多服务实例。处理程序的示例包括系统日志、符合性监控器(compliance monitor)、工作负载预测、工作负载管理器交互和简单通知。

服务域监控三类事件:关于它本身的事件、关于它所提供的功能的事件以及关于支持这些功能的服务实例的事件。这些事件便于您较好地进行以下操作:

  • 与定制处理的协作,如业务关系
  • 映射特定于实现的系统需求,如资源分配
  • 支持一致的系统管理和自动化体系结构

下列代码段说明了事件处理程序在服务实例计数器达到其阈值时为 ServiceHub 克隆服务实例。这是用来支持服务域部署服务演示程序的。


<event-handling-section>
   <event type="ServiceInstanceCounter">
     <parameter name="Threshold" value="10" />
     <parameter name="Instance" value="/servicedomain/
         DummyServiceA_Impl.wsdl" />
     <listener name="CloneInstance" />
   </event>
</event-handling-section>

                

下列代码注释详细说明了预制的 ServiceDesk 和 ServiceHub 服务域所支持的事件类型,以及一个将事件数据和时间戳记记录到日志文件的通用事件处理程序。


<event-handling-section>

<!--  Possible event types are:
ServiceDeskHighWatermark
ServiceDeskLowWatermark
FeatureResponsiveness
FeatureAvailability
ServiceDeskAvailability
ServiceDeskResponsiveness
ServiceInstanceCounter
InstanceHighWatermark
InstanceLowWatermark
InstanceAvailability
InstanceResponsiveness
ServiceDeskError
FeatureError
InstanceError
InstanceTimeout

    All events that are dependent on an Instance require an Instance 
    parameter tag.  The value of this parameter should be the 
    Implementation WSDL URL for the instance.
-->

 <event type="*">
   <!--
     The listeners for this event are invoked for every event that is 
     triggered.
   -->
   <listener name="GeneralEventHandler" /> 
     <!--
       GeneralEventHandler logs event data along with a time stamp in a 
       log file.
     -->
  </event>
  
</event-handling-section>

                





回页首


结束语


将服务域行为向外部世界定义的策略文件是服务域主要操作的智能基础,并且策略文件为系统管理和自动化提供了控制机制。服务域拥有者准备供应者合同和用户合同,以便将他们作为单个操作单元联系在一起。使用合同对应于服务策略中的服务级别和可适用的规则,而它们会根据供应者合同自动地映射到适用的服务实例。用户和供应者只需要跟他们的服务域打交道。与兆级系统(mega-system)环境交互的复杂性被彻底交给了服务域及其服务策略。

在本文中,我们展示了如何为服务域的几个方面配置策略。我们说明了如何创建服务级别定义、服务选择、安全性、错误恢复、事件监控和服务映射策略,以控制服务域的行为。

现在我们要将您的注意力转回到基本编程的基础机制上来,这就是如何在计算平台上部署服务域对象。本系列的下一篇文章将详细讨论部署 ? 服务域处理的下一个步骤。



参考资料



作者简介

作者

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 使用条款