httprequest_第8部分:使用HTTPRequest节点进行SLA检查

httprequest

当提供服务以在组织内重用时,服务的提供者通常会提供许多工件,服务的使用者可以使用这些工件来实现客户端应用程序或服务。 这些工件通常包括一个或多个WSDL或XML模式文档。 尽管这些工件提供了服务使用者的开发人员所需的信息,但它们并未提供有关服务使用者可以从服务中期望的非功能性或服务质量(QoS)特征的任何信息。

IBM WebSphere Service Registry and Repository(以下称为WSRR)提供的Governance Enablement Profile(GEP)是一个完整的WSRR配置概要文件,其中包含您需要快速起步的所有业务模型,生命周期,本体和治理策略。并与面向服务的体系结构(SOA)治理一起运行。 它使服务提供商可以使用服务级别定义(SLD)捕获服务的QoS特性。 它还使服务提供商和服务使用者之间存在的协议可以使用服务级别协议(SLA)表示。

本文介绍了一个示例消息流,该消息流在运行时强制执行WSRR中定义的SLA,以确保服务使用者被授权调用目标服务。 尽管它实现了与本系列第5部分中描述的消息流相同的结果,即在运行时和注册表查找场景中执行SLA检查 ,但本文中描述的消息流的实现却大不相同。 它使用HTTP请求节点来调用WSRR REST API来检索所需的元数据。

SLA检查业务方案

本文中描述的样本流主要关注本系列第1部分“ 场景和配置”中描述的SLA检查场景,如下所示:

  • 业务问题

    您已经在SOA中部署了几项服务,它们都已在WSRR中注册。 但是,您尚未在WSRR中注册这些服务的使用者。 结果,您不知道在任何给定时间点哪些服务使用者可能正在调用每个服务。 您想要确保SOA中的所有服务使用者都已在WSRR中注册,并且仅允许被授权调用目标服务的使用者进行注册。

  • WSRR允许您在SOA中注册服务使用者以及服务提供商。 它还使服务提供商和服务使用者之间存在的协议或合同可以使用服务级别协议(SLA)表示。 消息流可以在运行时动态地从WSRR检索此信息,并使用它来确定服务使用者是否被授权调用目标服务。 如果服务使用者有权调用目标服务,则它可以将请求转发到约定的端点。 如果服务使用者没有被授权调用目标服务,则可以返回适当的错误。

  • 好处

    这种方法使您可以控制哪些服务使用者正在调用实际的后端服务,从而使您能够在SOA中强制执行运行时治理。 另一个好处是,在服务使用者和提供者在WSRR中注册后,您可以在Service Registry Dashboard用户界面中可视化这些关系,并使用它来评估计划对服务进行的任何更改的影响。

建模服务提供商和消费者

GEP中包含的业务模型定义了代表服务提供者,服务使用者以及它们之间的协议所需的所有对象类型。 有关如何对这些概念进行建模的更多信息,请参见第5部分中的“建模服务提供者”和“建模服务使用者”部分。 熟悉这些概念,以便您可以完全理解此消息流的实现。

HTTP请求节点概述

IBM Integration Toolkit通过提供HTTP Request节点来提供与REST服务交互的支持。 该节点允许您将全部或部分输入消息用作发送到服务的请求。 在将消息传播到流中的后续节点之前,它还可以用于基于输入消息创建输出消息,并以服务响应的内容为补充。

可以将节点配置为从输入消息的指定部分构造HTTP或HTTPS请求,并将此请求发送到目标服务。 然后,它可以解析来自服务的响应,并将内容注入到输出树中,以传播到流中的其他节点。

节点终端

下图显示了HTTP请求节点的终端。

HTTP请求节点终端
HTTP请求节点终端

下表中描述了端子。

HTTP请求节点上的终端
终奌站 描述
接受消息以供节点处理的输入终端。
失败 如果在节点中进行处理期间检测到故障,消息将路由到该输出终端。
如果消息表示服务请求成功完成,并且在此消息流中需要进一步处理,则将消息路由到该输出终端。
错误 路由包含以下消息的输出终端,该消息包含不在200至299范围内的HTTP状态代码,如果尚未设置属性Follow HTTP(s)redirection属性,则包括重定向代码(3xx)。

节点属性

HTTP请求节点提供了广泛的属性集,可以使用IBM Integration Toolkit中的“属性”编辑器进行配置。 本文描述的消息流尚未修改其中的许多属性。 为简便起见,下表仅描述了已由消息流修改的HTTP请求节点的属性。

HTTP请求节点属性
属性 编辑器标签 描述
Web服务URL 基本的 目标服务的URL。 必须以http://hostname[:port]/[path]的形式指定,其中:
  • 必须指定http://hostname
  • port的默认值为80。如果您指定一个值,则必须在端口号之前包括:。
  • path的默认值为/。 如果指定值,则必须在路径前包含/。

可以使用消息流中较早的计算节点以编程方式指定Web Service URL属性的值,以将元素插入输入消息或本地环境树中。 以编程方式指定的值将覆盖在节点上指定的值。 可用于覆盖节点上指定的值的位置是:

  • 输入消息中HTTP Request标头中的X-Original-HTTP-URL
  • 本地环境树中的Destination.HTTP.RequestURL

显示的位置按优先级顺序列出。 也就是说,如果为X-Original-HTTP-URL字段指定了一个值,则Destination.HTTP.RequestURL覆盖Destination.HTTP.RequestURL字段中指定的任何值。

如果指定的URL以http://开头,则请求节点向指定的URL发出HTTP请求。 如果指定的URL以https://开头,则请求节点使用在SSL选项卡上为该节点指定的参数,对指定的URL进行基于SSL的HTTP(HTTPS)请求。

HTTP方法 HTTP设置 节点发出请求时将使用的HTTP方法。 有效值为POSTGETPUTDELETEHEAD 。 默认情况下,HTTP Request节点在连接到远程Web服务器时使用HTTP POST方法。
HTTP版本 HTTP设置 指定节点发出请求时将使用的HTTP版本。 有效值为1.0和1.1。
使用压缩 HTTP设置 此属性控制是否压缩HTTP请求的内容。 有效值为nonegzipzlib (deflate)deflate 。 如果请求被压缩,则设置Content-Encoding标头以指示内容已压缩。
协议 SSL协议

此属性指定发出HTTPS请求时要使用的协议。 SSL连接的两端必须在使用协议上达成一致。 因此,所选协议必须是远程服务器可以接受的协议。 提供以下选项:

  • SSL 。 此选项是默认选项。 此选项尝试首先使用SSLv3协议进行连接,但是使握手回落到基础JSSE提供程序支持SSLv2协议的SSLv2协议。
  • SSLv3 。 此选项尝试仅使用SSLv3协议进行连接。 无法回退到SSLv2。
  • TLS 。 此选项尝试仅与TLS协议连接。 无法回退到SSLv3或SSLv2。
邮件域 响应消息解析

指定将用于解析响应的解析器的名称。 如果该字段为空,则默认值为BLOB 。 提供以下选项:

  • DFDL
  • XMLNSC
  • JSON格式
  • BLOB
  • 哑剧
  • MRM
  • XMLNS
用Web服务响应替换输入消息 高级 如果选中此复选框,则Web服务响应消息将用作节点的输出消息,从而替换原始的输入消息。 如果清除此复选框,则必须为“ Response message location in tree指定一个值。
响应消息在树中的位置 高级 指定存储来自Web服务响应位流的已解析元素的位置。 此属性采用ESQL字段引用的形式。
默认接受压缩的响应 高级 此属性指示默认情况下请求节点是否处理压缩的响应。 如果请求标头不包含Accept-Encoding标头,并且选择了此选项,则该节点将Accept-Encoding标头设置为“ gzip,deflate”,并且该节点将Accept-Encoding到的所有压缩响应都解压缩。

访问安全服务

如果“ HTTP请求”节点正在访问的服务要求客户​​端进行身份验证,则必须将安全配置文件与该节点关联,以允许将凭据传播到目标服务。 IBM Integration Bus提供了一个配置文件,该配置文件已预先配置为允许凭证传播,并且专门供请求节点使用。 它称为默认传播安全配置文件。 要在消息流中的节点上配置此安全概要文件,必须使用IBM Integration Toolkit中的Broker Archive Editor 。 此安全概要文件已经在本系列文章随附的示例流中包含的所有HTTP请求节点上进行了配置。 要验证这一点,请执行以下步骤:

  1. 打开IBM Integration Toolkit
  2. 打开“ 集成开发”透视图。
  3. 在“ 应用程序开发”视图中,展开BAR,然后双击WSRRIntegrationDemos.bar ,如下所示:
    打开BAR文件
    打开BAR文件
  4. 该文件将在Broker Archive Editor中打开。 选择编辑器底部的“ 管理”选项卡。
  5. 展开WSRRIntegrationDemos => HTTPNode_SLACheck_GlobalCache.msgflow- > HTTPNode_SLACheck_GlobalCache
  6. 从流中的节点列表中,选择WSRR REST Query ,如下所示:
    选择节点
    选择节点
  7. 节点的属性将显示在“ 属性”编辑器中。 安全配置文件属性位于“ 配置”选项卡上的属性列表的底部,如下所示:
    安全配置文件属性
    安全配置文件属性

IBM Integration Bus全局高速缓存

使用Endpoint Lookup和Registry Lookup节点与WSRR进行交互的好处之一是IBM Integration Bus为这些节点提供了一个高速缓存,该高速缓存用于存储在可配置的时间段内检索到的元数据。 在第7部分:在IBM Integration Bus中配置WSRR高速缓存中详细描述了该高速缓存。 但是,由于本文中描述的消息流未使用WSRR节点,因此必须使用另一种缓存机制来确保针对每个已处理的请求查询WSRR都不会影响流的性能。

幸运的是,IBM Integration Bus提供了另一种缓存机制,消息流可用于存储从WSRR检索到的元数据。 全局高速缓存首次引入WMB V8.0.0.1,并在IBM Integration Bus V9中得到了增强。 全局缓存是使用嵌入式WebSphere eXtreme Scale(WebSphere XS)技术实现的。 通过托管WebSphere XS组件,IBM Integration Bus执行组中嵌入的JVM可以协作以提供缓存。

默认情况下,全局缓存关闭,并且缓存策略设置为禁用。 要使用全局缓存,必须在代理级别指定适当的缓存策略。 全局缓存具有默认的单代理拓扑,无需任何配置即可立即使用。

与全局缓存交互

IBM Integration Bus提供了MbGlobalMap对象,以使消息流能够访问全局高速缓存。 这是一个Java对象,因此必须在流中的Java Compute节点中使用。 该对象处理客户端到全局缓存的连接,并提供了许多用于处理缓存中的映射的方法。 可用的方法与您在常规Java映射中可以找到的方法类似。 单个MbGlobalMap对象是通过使用MbGlobalMap类上的静态获取器创建的,该类用作工厂机制。 您可以匿名创建MbGlobalMap对象(在WebSphere XS的封面下使用预定义的默认地图名称),也可以使用您选择的地图名称。 在下面列出了一个MbGlobalMap对象中示出的代码被用WSRREndpointCache的名称创建。

启用全局缓存
MbGlobalMap endpointCache = MbGlobalMap.getGlobalMap("WSRREndpointCache");

从全局缓存中删除数据

获取MbGlobalMap对象时,还可以指定数据在自动删除之前在全局缓存中保留的时间。 该时间称为生存时间,从上次更新该地图条目时算起。 该值适用于在消息流的该实例中使用该MbGlobalMap对象创建的所有缓存条目。 默认情况下,生存时间设置为零,以便永远不会删除数据。 要设置特定的生存时间,您需要创建一个会话策略,您可以从MbGlobalMap对象中引用该策略。 以下清单中的代码显示了如何使用活动时间为30秒的会话策略创建MbGlobalMap对象。

启用全局缓存
MbGlobalMapSessionPolicy sessionPolicy = new MbGlobalMapSessionPolicy(30);
MbGlobalMap endpointCache = MbGlobalMap.getGlobalMap("WSRREndpointCache", sessionPolicy);

WSRR命名查询

WSRR中的命名查询提供了一种强大的机制,可让您创建可使用任何WSRR API调用的预定义查询。 它们是在配置文件中定义的,这些文件是WSRR配置概要文件的一部分。 因此,WSRR管理员可以使用WSRR,Web UI或管理脚本随附的WSRR Studio工具来创建,修改和删除它们。

定义命名查询时,您为配置文件指定的名称用于标识查询。 WSRR客户端使用此名称来指定他们要调用的命名查询。 命名查询配置文件的内容定义:

  • 查询的类型为propertyQuerygraphQuery
  • 调用查询时将针对WSRR执行的XPath表达式。 此XPath表达式可以包含调用命名查询时客户端必须传递的参数的定义。 在执行查询之前,将在服务器上的运行时替换参数。
  • 查询的深度(如果指定的类型为graphQuery 。 必须为0、1或-1。
  • 返回的属性列表(如果指定的类型为property

命名查询的真正功能是封装配置文件中所需的所有信息。 WSRR客户端仅需要知道他们要调用的命名查询的名称以及需要传递哪些参数。 WSRR客户端隐藏了基础模型的复杂性以及用于查询模型的XPath表达式。 命名查询还提供了针对模型更改的保护级别,因为它允许修改配置文件中的XPath表达式以反映更改而不会影响客户端。

SLAEndpointLookup命名查询

SLAEndpointLookup命名查询在WSRR 7.5版中引入了GEP。 它定义了一个XPath表达式,该表达式执行所有必要的检查,以确保服务使用者被授权调用目标服务。 回想一下,在第5部分的SLA检查节点部分中 ,所有这些检查都需要在Java Compute节点中以编程方式执行。 SLAEndpointLookup命名查询可以在单个XPath表达式中捕获所有这些检查,因为可以自由定义遍历多个对象并在查询的各个阶段应用谓词的复杂表达式。 IBM Integration Bus中的“端点查找”或“注册表查找”节点均不允许您控制所生成的XPath表达式。

如上所述,用于SLAEndpointLookup命名查询的XPath表达式很复杂,在此不再详细描述。 但这又是在WSRR中使用命名查询的好处。 WSRR客户端不需要了解命名查询配置的复杂性。 它只需要了解它需要传递的参数和应该返回的结果。 对于SLAEndpointLookup,所需的参数为:

  1. 服务使用者的使用者标识符
  2. SLA的上下文标识符
  3. 端点的环境分类的OWL URI

返回的对象是在目标服务提供者的SLD上定义的服务端点。

WSRR REST API

WSRR提供了许多可用于与产品中注册的服务元数据工件进行交互的API,如下所示:

  • 企业JavaBean(EJB)API
  • Web服务API
  • REST API

所有这些API支持发布(创建和更新)服务构件和与这些构件相关联的元数据,检索服务元数据构件,删除构件及其元数据以及查询WSRR的内容。 通过这些API提供了基本的创建,检索,更新和删除操作,以及治理操作和基于XPath的灵活查询工具。

WSRR REST API允许不支持EJB和Web服务的轻量级客户端使用HTTP请求对内容和元数据执行操作。 WSRR客户端还能够使用REST API来调用已在WSRR中配置的命名查询。 例如,可以将以下清单中显示的URL粘贴到Web浏览器中,以调用SLAEndpointLookup命名查询,并将三个必需的参数作为URL查询参数传递。 为了清楚起见,将参数分成多行,并且p3参数的OWL URI需要进行URL编码。

示例命名查询URL
https://localhost:9443/WSRR/8.0/Metadata/XML/Query/SLAEndpointLookup?
  p1=CalculatorApplication&
  p2=CTX_1&
  p3=http://www.ibm.com/xmlns/prod/serviceregistry/6/1/GovernanceProfileTaxonomy#Staging

消息流说明

SLA检查消息流(如下图所示)使用服务请求中指定的使用者标识符和上下文标识符来确定服务使用者是否被授权调用目标服务。 为此,它调用SLAEndpointLookup命名查询来检索服务使用者被授权用来调用服务的端点列表。 如果返回一个或多个端点,它将选择第一个端点并将请求转发给它。 如果没有返回端点,它将以适当的错误响应客户端。 以下各节详细描述了此消息流中的每个节点,以及每个节点用来执行SLA检查的任何设置或代码。

SLA检查消息流
SLA检查消息流

服务请求节点

该流程从“ Service Request SOAP输入”节点开始。 关于此节点需要注意的重要一点是,它已配置为公开Math Service的接口。 这是在节点的“ 属性”编辑器的“ 基本”选项卡上指定的,如下图所示。 您可以看到在WSDL文件名字段中指定了MathServerServiceDummyEndpoint.wsdl 。 选择WSDL文件后,将自动填写该节点的其他基本属性。 当配置为公开特定的WSDL接口时, SOAP Input节点将验证它收到的任何服务请求,以确保它们符合WSDL中包含的服务的定义。 该节点还配置为使用HTTP传输,其URL后缀为/ MathServer / Services / MathServer / slacheck5 。 这是消费者在调用此流程公开的服务时需要使用的值。 服务请求节点使用out终端连接到SLA检查流程中的下一个节点。

公开的WSDL接口
公开的WSDL接口

检查SOAP标头节点

Check SOAP Headers节点是Java Compute节点的一个实例。 该节点处理由Service Request节点传递给它的Service Request ,并从SOAP头中提取使用者标识符上下文标识符属性。 然后,它检查提取的值是否有效。 以下清单中的代码显示了正在执行的这些任务。

提取消费者标识符和上下文标识符
MbMessage inMessage = inAssembly.getMessage();
MbElement rootElement = inMessage.getRootElement();

MbElement consumerIdElement =
    rootElement.getFirstElementByPath("/SOAP/Header/MathHeader/consumerID");

MbElement contextIdElement =
    rootElement.getFirstElementByPath("/SOAP/Header/MathHeader/contextID");
    
if (  consumerIdElement != null && consumerIdElement.getValue() != null
   && contextIdElement != null &&contextIdElement.getValue() != null)
   {
        ...
}

如果在服务请求中为这些标识符之一指定有效值,则“ Check SOAP Headers节点将生成SOAP错误,并将消息传递给故障终端。 该终端直接连接到SOAP Reply节点,该节点将SOAP故障传递回客户端。 此检查很重要,并且在消息流的最开始执行,因为该流需要能够识别服务使用者和适用于服务请求的相关SLA。

通过此初始检查后,“ Check SOAP Headers节点将消息传递到out终端,该终端连接到“ Check WSRR Cache节点。

检查WSRR缓存节点

Check WSRR Cache节点是Java Compute节点的另一个实例。 顾名思义,该节点检查在IBM Integration Bus全局高速缓存中维护的端点的高速缓存,以查看之前是否已检索到此消费者标识和上下文标识的组合的任何端点。 因为使用者标识符和上下文标识符都应该是唯一的,所以通过简单地将两个值串联起来就可以生成进入缓存的密钥。 以下清单显示了正在执行的这些任务。

检查IBM Integration Bus全局高速缓存
WSRRCache wsrrCache = WSRRCache.getInstance();
            
String consumerId = getConsumerId(inAssembly);
String contextId = getContextId(inAssembly);
String cacheId = consumerId + contextId;
String addressUrl = wsrrCache.getEndpoint(cacheId);

if (addressUrl != null && !addressUrl.isEmpty()) {
    ...
} else {
    ...
}

WSRRCache实用程序类用于维护IBM Integration Bus全局高速缓存中的端点的高速缓存。 以下清单显示了如何访问缓存以尝试检索端点。 还需要注意的是,缓存中条目的生存时间策略为30秒。

检查IBM Integration Bus全局高速缓存
MbGlobalMapSessionPolicy sessionPolicy = new MbGlobalMapSessionPolicy(30);
endpointCache = MbGlobalMap.getGlobalMap("WSRREndpointCache", sessionPolicy);
...
public String getEndpoint(String cacheId) {
    String endpoint = null;
        
    try {
        endpoint = (String)endpointCache.get(cacheId);
    } catch (MbException e) {
        e.printStackTrace();
    }

    return endpoint;
}

如果在高速缓存中找到了具有指定ID的端点,那么消息流只是将服务请求转发到目标服务,而无需对WSRR执行任何查询。 为此,SLA检查消息流使用一个称为Forward RequestSOAP Request节点。 要以编程方式覆盖在“ Forward Request节点上配置的Web服务URL ,“ Check WSRR Cache节点需要将端点地址插入本地环境树的Destination.SOAP.Request.Transport.HTTP.WebServiceURL字段中。 以下清单显示了执行此任务所需的代码。 然后,“ Check WSRR Cache节点将消息传递到out终端,该终端连接到Forward Request节点。

以编程方式指定Web服务URL
MbMessage environment = new MbMessage(inAssembly.getLocalEnvironment());
MbElement environmentRoot = environment.getRootElement();

environmentRoot.evaluateXPath(
    "?Destination/?SOAP/?Request/?Transport/?HTTP/?WebServiceURL[set-value('"
    + addressUrl + "')]");

outAssembly = new MbMessageAssembly( inAssembly
                                   , environment
                                   , inAssembly.getExceptionList()
                                   , inAssembly.getMessage()
                                   );
outTerminal = getOutputTerminal("out");

如果在高速缓存中未找到具有指定ID的端点,则消息流需要调用WSRR中的SLAEndpointLookup命名查询,将使用者标识符和上下文标识符作为参数传递,并传递目标端点环境的OWL URI。 为此,它必须构造将用于调用命名查询的URL,并将其插入本地环境树的Destination.HTTP.RequestURL字段中。 它通过以编程方式从IBM Integration Bus中的DefaultWSRR配置服务对象中查询endpointAddress属性,并提取值来确定用于URL的方案,主机和端口。 该任务由WSRRConfigurationUtils实用程序类执行。 它还必须将名为SLAEndpointLookup的名为query的参数插入到本地环境树的相关字段中。 以下清单显示了执行这些任务所需的代码。

以编程方式指定REST URL
private static final String NAMED_QUERY_SLAENDPOINTLOOKUP =
    "/WSRR/8.0/Metadata/XML/Query/SLAEndpointLookup";
private static final String OWL_URL_STAGING =
    "http://www.ibm.com/xmlns/prod/serviceregistry/6/1/GovernanceProfileTaxonomy#Staging";
        
WSRRConfigurationUtils wsrrConfig = WSRRConfigurationUtils.getInstance(); 

URI wsrrUrl = new URI( wsrrConfig.getScheme()
                     , null
                     , wsrrConfig.getWsrrHost()
                     , wsrrConfig.getWsrrPort()
                     , NAMED_QUERY_SLAENDPOINTLOOKUP
                     , null
                     , null);
environmentRoot.evaluateXPath("?Destination/?HTTP/?RequestURL[set-value('"
    + wsrrUrl.toString() + "')]");
                
environmentRoot.evaluateXPath("?Destination/?HTTP/?QueryString/?p1[set-value('"
    + getConsumerId(inAssembly) + "')]");
environmentRoot.evaluateXPath("?Destination/?HTTP/?QueryString/?p2[set-value('"
    + getContextId(inAssembly) + "')]");
environmentRoot.evaluateXPath("?Destination/?HTTP/?QueryString/?p3[set-value('"
    + OWL_URL_STAGING + "')]");

Check WSRR Cache节点可以将请求转发到HTTP Request节点之前,它需要执行其他一些任务。

  1. 下游HTTP Request节点已配置为将响应消息放置在本地环境树中的特定位置。 Check WSRR Cache节点需要在本地环境树中创建父条目。
  2. HTTP Request节点不使用BrokerRegistry对象上的配置来确定在发送HTTP请求时要使用哪个密钥库和信任库。 在流程中调用HTTP Request节点之前,必须在本地环境中以编程方式配置密钥库和信任库的位置以及它们的密码。 WSRRConfigurationUtils实用程序类用于从名为WSRRREST的用户定义的可配置服务中检索此信息。
  3. 需要在输出消息上以编程方式定义调用REST API时需要由HTTP Request节点传播到WSRR的凭据。 再次,使用WSRRConfigurationUtils实用工具类来检索此信息。

以下清单显示了执行这些任务所需的代码。 然后,“ Check WSRR Cache节点将消息传递到备用终端,该备用终端连接到WSRR REST Query节点。

配置其他属性
// Create a folder in the local environment to hold the response from the REST query
environmentRoot.createElementAsLastChild(MbXMLNSC.PARSER_NAME);

// Specify the location of the keystore and truststore used by the HTTP Request node
environmentRoot.evaluateXPath("?Destination/?HTTP/?KeystoreFile[set-value('"
    + wsrrConfig.getKeystoreFile() + "')]");
environmentRoot.evaluateXPath("?Destination/?HTTP/?KeystorePassword[set-value('"
    + wsrrConfig.getKeystorePassword() + "')]");
environmentRoot.evaluateXPath("?Destination/?HTTP/?TruststoreFile[set-value('"
    + wsrrConfig.getTruststoreFile() + "')]");
environmentRoot.evaluateXPath("?Destination/?HTTP/?TruststorePassword[set-value('"
    + wsrrConfig.getKeystorePassword() + "')]");

// Create the message assembly to return
MbMessage outMessage = new MbMessage(inMessage);
MbElement rootElement = outMessage.getRootElement();
rootElement.evaluateXPath("?Properties/?IdentitySourceType[set-value("
    + "'usernameAndPassword')]");
rootElement.evaluateXPath("?Properties/?IdentitySourceToken[set-value('"
    + wsrrConfig.getUserId() + "')]");
rootElement.evaluateXPath("?Properties/?IdentitySourcePassword[set-value('"
    + wsrrConfig.getPassword() + "')]");
outAssembly = new MbMessageAssembly( inAssembly
                                   , environment
                                   , inAssembly.getExceptionList()
                                   , outMessage
                                   );
outTerminal = getOutputTerminal("alternate");

WSRR REST查询节点

WSRR REST Query节点是HTTP Request节点的实例。 它的行为由上一个节点以编程方式创建的条目与节点本身上定义的属性的组合来确定。 下表显示了在WSRR REST Query节点上指定的属性的值。

WSRR REST查询节点属性
属性
HTTP方法 得到
HTTP版本 1.1
使用压缩 gzip
协议 SSL协议
邮件域 XMLNSC
用Web服务响应替换输入消息 未检查
响应消息在树中的位置 InputLocalEnvironment.XMLNSC.WSRR.REST.Response
默认接受压缩的响应 已检查

WSRR REST Query节点将在WSRR中调用名为SLAEndpointLookup的查询,并将结果写入节点上配置的位置。 输出终端连接到“ Cache REST Results节点。

缓存REST结果节点

Cache REST Results节点处理WSRR REST Query节点返回的结果。 它尝试从本地环境树中提取查询返回的端点列表,并检查是否返回了任何端点。 以下清单显示了执行此任务所需的代码。 如果没有返回端点,则该节点将生成SOAP错误,并将消息传递给故障终端。 该终端直接连接到SOAP Reply节点,该节点将SOAP故障传递回客户端。

检查REST结果
MbElement rootElement = inAssembly.getLocalEnvironment().getRootElement();
MbElement wsrrElement = rootElement.getFirstElementByPath("XMLNSC/WSRR");
List<MbElement> availableEndpoints =
    (List <MbElement>)wsrrElement.evaluateXPath("REST/Response/resources/resource");

if (availableEndpoints != null && !availableEndpoints.isEmpty()) {
    ...
} else {
    ...
}

如果针对WSRR的REST查询的结果返回了某些端点,那么“ Cache REST Results节点仅选择第一个,并将其缓存在IBM Integration Bus全局高速缓存中,通过将使用者标识和上下文标识进行级联来生成密钥。 将端点存储在缓存中之后,“ Cache REST Results节点通过在本地环境树中设置相关值并将消息传播到“ Forward Request节点,将服务请求转发到目标服务。 以下清单显示了执行此任务所需的代码。

缓存端点
MbElement endpoint = availableEndpoints.get(0);
String addressUrl = (String)endpoint.evaluateXPath(
    "string(properties/property[@name='name']/attribute::value)");      

if (addressUrl != null) {

    // Cache the results
    String consumerId = getConsumerId(inAssembly);
    String contextId = getContextId(inAssembly);
    String cacheId = consumerId + contextId;
    wsrrCache.addEndpoint(cacheId, addressUrl);
                    
    MbMessage environment = new MbMessage(inAssembly.getLocalEnvironment());
    MbElement environmentRoot = environment.getRootElement();
                    
    environmentRoot.evaluateXPath(
        "?Destination/?SOAP/?Request/?Transport/?HTTP/?WebServiceURL[set-value('"
        + addressUrl + "')]");

    // Create the message assembly to return
    outAssembly = new MbMessageAssembly( inAssembly
                                       , environment
                                       , inAssembly.getExceptionList()
                                       , inAssembly.getMessage()
                                       );
    outputTerminal = getOutputTerminal("out");
}

转发请求和SOAP回复节点

Forward Request节点负责调用目标服务,在本例中为Math Service的 1.0版 。 定义流时,您必须在此节点上为Web Service URL属性指定一个值,即使该值在运行时被流中的Java Compute节点以编程方式覆盖。 结果,为此属性指定了伪值http://tempuri.org/MathServer/services/MathServer 。 要注意的另一个重要点是,必须将节点的“ 操作模式 ”设置为“ 调用通用Web服务” 。 这是在节点的属性编辑器的“ 基本”选项卡上指定的。 它使流程可以代理对数学服务上定义的任何操作的请求,而不必强制代理单个操作。 Forward Request节点使用其所有终端直接连接到SOAP Reply节点。 失败

顾名思义, SOAP Reply节点只是将SOAP响应传递回服务使用者。 在成功通过该流程时,返回的响应将是来自实际目标服务的响应。 如果发生错误,则响应将是由流中的Java Compute节点之一或目标服务本身生成的SOAP错误。

附加配置

在测试SLA检查消息流之前,需要执行一些其他配置步骤。 在以下各节中对这些内容进行了描述:

启用IBM Integration Bus全局高速缓存

此中描述的消息流要求启用全局缓存才能正常工作。 要在将流部署到的代理实例上启用全局缓存,请使用mqsichangeproperties命令,如下面的清单所示。 重新启动代理以使更改生效。

启用全局缓存
mqsichangeproperties <BROKER_NAME>
                     -b cachemanager
                     -o CacheManager
                     -n policy
                     -v default

哪里:

  • <BROKER_NAME>是代理的名称(集成节点)。

创建WSRRREST可配置服务

需要以编程方式为HTTP Request指定各种属性。 这些属性的值可能已被硬编码到流中。 更好的解决方案是在IBM Integration Bus中创建用户定义的可配置服务,并在运行时动态检索属性。 这是此消息流中采用的方法。 要创建可配置服务,请使用mqsicreateconfigurableservice命令,如以下清单所示:

创建WSRRREST可配置服务
mqsicreateconfigurableservice
<BROKER_NAME> -c UserDefined -o WSRRREST

哪里:

  • <BROKER_NAME>是代理的名称(集成节点)。

要在WSRRREST可配置服务上创建必需的属性,您需要使用mqsichangeproperties命令,如下所示:

创建所需的属性
mqsichangeproperties <BROKER_NAME>
                    -c UserDefined
                    -o WSRRREST
                    -n keystoreFile
                    -v <KEY_STORE_FILE>

哪里:

  • <BROKER_NAME>是代理的名称(集成节点)。
  • <KEY_STORE_FILE>是密钥存储文件的完整路径。 为了配置此消息流,您实际上可以将在第1部分:方案和配置中创建的信任库用作密钥库和信任库。

重复此过程,以在WSRRREST可配置服务上创建以下属性:

WSRRREST可配置服务属性
物业名称
keystorePassword 密钥库的密码。
truststoreFile 信任库文件的完整路径。
truststorePassword 信任库的密码。
用户身份 有权访问WSRR中的所需工件的用户的ID。
用户密码 该用户的密码。

此时,您应该重新启动代理(集成节点),以确保所有更改都生效。

测试消息流

下一节将向您展示如何使用计算器应用程序来验证SLA Check流程是否正常运行。

基本测试

  1. 确保您的IBM Integration Bus执行组正在运行,并且已部署并启动了HTTPNode_SLACheck_GlobalCache流。
  2. 第1部分中的“运行计算器应用程序”所述,启动计算器应用程序。
  3. 输入运行IBM Integration Bus的服务器的主机名端口号值。 例如,如果您在与Calculator应用程序相同的机器上运行IBM Integration Bus,并且使用缺省端口,则这些值将为localhost和7800 。
  4. 修改服务的路径,将其值设置为/ MathServer / services / MathServer / slacheck5 。 这是HTTPNode_SLACheck_GlobalCache流的端点。
  5. 使用者ID设置为CalculatorApplication 。 这是在代表计算器应用程序的WSRR中的“ Application Version上指定的使用者标识符。
  6. 上下文ID设置为CTX_1 。 这是在SLA上指定的上下文标识符,它表示Calculator应用程序和Math Service之间的使用协议。
  7. 使用数字字段和运算符下拉菜单输入您要执行的计算。 输入所有信息后, Calculator应用程序应类似于此:
    设置计算器应用程序以使用SLA检查消息流
    设置计算器应用程序以使用SLA检查消息流
  8. 单击= (等于按钮)。 计算器应用程序将向SLA检查消息流发送服务请求,该服务请求会将请求路由到实际的Math Service 。 结果最终返回到计算器应用程序,然后显示。

如果您收到来自应用程序的错误,请检查以下内容:

  1. 您已经执行了第1部分:场景和配置中描述的所有配置步骤。
  2. 您已经为流指定了正确的路径( / MathServer / services / MathServer / slacheck5 )。
  3. 您指定了正确的使用者标识符( CalculatorApplication )。
  4. 您指定了正确的上下文标识符( CTX_1 )。

进阶考试

为了验证消息流执行的检查是否正常工作,您需要在WSRR中修改相关对象的状态,然后测试对流行为的影响。 以下各节描述了如何执行这些测试。

停用和重新激活SLA

  1. 启动计算器应用程序并执行计算以检查消息流是否正常运行。
  2. 在Web浏览器中,登录到WSRR实例的Service Registry Dashboard
  3. 切换到SOA治理视图,然后选择Overview页面。
  4. 在“ 集合”小部件中选择“ SLA-CalculatorApplication 1.0到MathService 1.0 ”,如下所示:
    SOA治理视图
    SOA治理视图
  5. 您将被带到“ 浏览”页面,该页面将在“ 细节”小部件中显示SLA-CalculatorApplication 1.0到MathService 1.0服务级别协议的详细信息 。 这表示WSRR中Calculator应用程序和Math Service之间的使用协议。 选择操作=>停用SLA ,如下所示:
    停用SLA
    停用SLA
  6. 操作完成后,将显示“ 操作成功”对话框。 单击确定 。 SLA的管理状态已更改为SLA Inactive
  7. 转到“ 计算器”应用程序,然后尝试执行其他计算。 消息错误:无法调用数学服务。 显示在应用程序的底部。
  8. 返回Service Registry仪表板 ,通过选择Action => Activate SLA重新激活SLA 。 操作完成后,单击“ 确定 ”。 SLA现在具有SLA Active的治理状态。
  9. 转到“ 计算器”应用程序 ,然后尝试执行其他计算。 这次操作成功。

使端点脱机

  1. 启动计算器应用程序并执行计算以检查消息流是否正常运行。
  2. 在Web浏览器中,登录WSRR实例的Service Registry仪表板
  3. 切换到SOA治理视图,然后选择Overview页面。
  4. 在“ 批准的业务能力”集合中选择MathService
  5. 您将转到“ 浏览”页面,该页面将在“ 详细信息”小部件中显示MathService业务服务的详细信息 。 这是WSRR中Math Service的业务表示。 在此小部件的“ 版本”下,选择MathService‪(1.0)
  6. 详细信息小部件将被更新以显示MathService(1.0)服务版本的详细信息。 这表示WSRR中的Math Service的实现,特别是1.0版。 在“ 细节”小部件中的“ 服务级别定义”下,选择“ SLD-MathService v1.0”
  7. 详细信息小部件将被更新以显示SLD-MathService v1.0 SLD的详细信息。 在“ 详细信息”小部件中的“ 可用端点”下,选择http:// localhost:7800 / MathServer1 / services / MathServer‪(1.0) 。 请注意,如果您的IBM Integration Bus实例未使用缺省端口来侦听HTTP请求,则端点的端口号可能会有所不同。
  8. 详细信息小部件将更新为显示http:// localhost:7800 / MathServer1 / services / MathServer‪(1.0)终结点的详细信息。 选择“操作” =>“从使用中撤消”
  9. 操作完成后,单击“ 确定 ”。 端点现在具有脱机状态。 Math Service 1.0版的两个端点现在都应该处于“ 脱机”状态
  10. 转到“ 计算器”应用程序,然后尝试执行其他计算。 消息错误:无法调用数学服务。 显示在应用程序的底部。
  11. 返回Service Registry Dashboard ,通过选择Action => Approve For Usehttp:// localhost:7800 / MathServer1 / services / MathServer‪(1.0)端点切换回在线状态。 操作完成后,单击“ 确定 ”。 现在,端点的治理状态为Online
  12. 转到“ 计算器”应用程序,然后尝试执行其他计算。 这次操作成功。

结论

本文介绍了一个示例消息流,该消息流在运行时强制执行WSRR中定义的SLA。 消息流使用HTTP请求节点使用WSRR REST API执行名为query的SLAEndpointLookup。 该命名查询通过检查服务使用者与服务提供者是否具有活动的SLA来验证服务使用者是否有权调用目标服务。 然后,它返回在WSRR中注册的目标服务的所有联机端点。

第5部分:在运行时执行SLA检查中提供了针对此业务问题的替代解决方案。 该解决方案利用注册表查找节点从WSRR中检索服务使用者的元数据。 这是使用HTTP请求节点的好处:

  • 您可以完全控制用于查询WSRR的XPath表达式。 这使您可以定义复杂的XPath表达式,这些表达式可以遍历多个关系并在查询的各个阶段应用谓词。 结果,您通常需要在消息流中实现更少的代码来处理结果。 IBM Integration Bus中的“端点查找”或“注册表查找”节点均不允许您控制所生成的XPath表达式。
  • 您可以完全控制针对WSRR执行的查询的类型。 IBM Integration Bus中的Endpoint Lookup或Registry Lookup节点都针对WSRR执行图形查询,这可能会返回大量数据,并且性能不如WSRR服务器上的属性查询。 使用属性查询可让您仅检索执行客户端处理所需的那些属性,并且性能更高。
  • 您可以使用WSRR REST API来调用WSRR中的命名查询。 这消除了客户端了解WSRR中查询的数据结构的需要。 客户只需要知道命名查询的名称,要传递的参数以及返回的对象类型。

当然,使用HTTP Request节点有一些缺点:

  • HTTP Request节点未使用IBM Integration Bus中的WSRR高速缓存,因此您需要实现代码以手动处理所需的任何高速缓存。
  • 由于大多数验证是在命名查询中定义的实际XPath表达式中执行的,因此消息流无法确切说明其为何拒绝请求。 它只是知道命名查询没有返回任何结果,但不知道确切原因。

致谢

作者要感谢以下人员为开发本系列的示例消息流而提供的所有帮助:

  • 约翰·霍西
  • 本汤普森
  • 马特·高比·柯克
  • 特雷弗·杜比(Trevor Dolby)
  • 安德烈亚斯·马滕斯(Andreas Martens)
  • 格雷厄姆·哈克斯比(Graham Haxby)
  • 安德鲁·科尔曼
  • 约翰·里夫

作者还要感谢Anna Maciejkowicz对本文的审阅提供的帮助。


翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1404_smithson8/1404_smithson8.html

httprequest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值