语音端点检测解决方案_第3部分:端点查找方案

语音端点检测解决方案

通常,您绝对不应允许在SOA环境中直接访问服务提供商。 相反,您应该将新的虚拟服务部署到企业服务总线(ESB),该服务充当真实后端服务的代理。 引入对后端服务的控制访问点可带来许多好处。 它以其最基本的形式实现了服务使用者和服务提供者之间的松散耦合,使您可以重新定位后端服务或修改其接口,而不必影响服务使用者。 这种模式通常称为简单服务代理。 它还使您能够引入服务管理功能,例如错误处理和警报,日志记录,安全配置,流量管理,服务收费和性能评估。 这些是对简单服务代理模式的扩展。

本文介绍了三个示例消息流。 第一个是简单服务代理模式的实现,该模式在运行时从WSRR动态检索真正的后端服务的端点。 第二个扩展了此模式,以允许在不同的提供者端点之间进行选择。 最终模式是另一种扩展,它允许在调用最初选择的端点时发生故障时将服务请求路由到备用端点。

服务位置业务场景

所描述的第一个示例流程着重于第1部分:场景和配置中描述的服务位置场景,如下所示:

  • 业务问题

    充当其他服务代理或在运行时调用其他服务的消息流需要知道这些服务的位置或端点。 服务的位置可以硬编码到每个消息流中,但这会使它们容易受到环境变化的影响。 例如,如果调用的任何服务的位置发生更改,则受影响的消息流都需要使用新位置进行更新并重新部署。 在开发过程中,当每个消息流在各种环境中移动时,可能还需要修改每个消息流所调用的服务的位置。

  • 可以在WSRR中注册被调用服务的位置,并在运行时由消息流动态检索。 如果服务的位置由于某些原因而发生更改,那么更新在WSRR中注册的端点是一项简单的任务,以便任何受影响的消息流都可以将请求路由到服务的新位置。

  • 好处

    无论是对消息流的影响还是在系统管理方面,此方法都可以减少对服务位置所做的更改的影响。

    它还允许在不使服务使用者知道更改或无需更改体系结构以支持替代的情况下,用一个服务提供商替换另一个服务提供商。

服务位置消息流

服务位置消息流(如中所示)使用Endpoint Lookup节点在运行时从WSRR检索目标服务的端点。 这是本系列中描述的最简单的消息流,因为它不需要任何其他编程即可执行其任务。

基本端点查找消息流
基本端点查找消息流

服务请求节点

该流程从“ Service Request SOAP输入”节点开始。 该节点配置为公开Math Service的接口。 这是在节点的属性编辑器的“ 基本”选项卡上指定的,如所示。 您可以看到在WSDL文件名字段中指定了MathServerServiceDummyEndpoint.wsdl 。 顾名思义,此WSDL文档定义了服务的虚拟端点,以确保将服务请求成功路由到目标服务的唯一方法是从WSRR中检索端点。

一旦选择了WSDL文件,该节点的其他基本属性将自动填写。 当配置为公开特定的WSDL接口时, SOAP Input节点将验证它收到的任何服务请求,以确保它们符合WSDL中包含的服务的定义。 此节点还配置为使用HTTP传输,其URL后缀为/ MathServer / Services / MathServer / eplookup1 。 这是消费者在调用此流程公开的服务时需要使用的值。 服务请求节点使用out终端连接到服务位置流中的下一个节点。

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

端点查找节点

Endpoint Lookup节点查询WSRR以检索1.0版Math Service的端点。 用于查询WSRR的属性指定如下:

端点查找节点属性
物业名称
端口类型名称 MathServerPortType
PortType命名空间 http://math.pot.ibm.com
端口类型版本 1.0
分类 http://www.ibm.com/xmlns/prod/serviceregistry/lifecycle/v6r3/LifecycleDefinition#Online
比赛政策 One

已经在节点上指定了“匹配策略”“ 1”,这使该节点可以直接连接到SOAP Request节点,在本例中为“ Forward Request节点。

端点查找节点
端点查找节点

如果由“ Endpoint Lookup节点执行的Endpoint Lookup返回任何结果,则该节点会将消息传递给NoMatch终端。 该端子连接到No Match Fault节点。

转发请求和SOAP回复节点

Forward Request节点负责调用目标服务。 定义流时,即使在运行时Endpoint Lookup节点会以编程方式覆盖该值,也必须为Web Service URL属性指定一个值。 结果,为此属性指定了伪值http://tempuri.org/MathServer/services/MathServer 。 节点的“ 操作”模式必须设置为“ 调用通用Web服务” ,这是在该节点的“ 属性”编辑器的“ 基本”选项卡上指定的。 使用outfailure终端将Forward Request节点直接连接到SOAP Reply节点。

转发请求和SOAP回复节点
转发请求和SOAP回复节点

顾名思义, SOAP Reply节点只是将SOAP响应传递回服务使用者。 在成功通过该流程时,返回的响应将是来自实际目标服务的响应。 如果“ Endpoint Lookup节点无法在WSRR中找到在线端点,则响应将是由“ No Match Fault节点生成的SOAP故障。

无匹配故障节点

如果由“ Endpoint Lookup节点执行的Endpoint Lookup未返回任何结果,则不会自动生成SOAP错误。 为此,将此节点的NoMatch终端连接到No Match Fault Java Compute节点。 该节点以编程方式生成SOAP故障,并使用SOAP Reply节点将其返回给服务使用者。

测试服务位置消息流

接下来的步骤描述了如何使用计算器应用程序来验证服务位置消息流是否正常工作。

  1. 确保您的IBM Integration Bus执行组正在运行,并且已部署并启动了EndpointLookup_Basic流。
  2. 如第1部分中的运行计算器应用程序中所述, 启动计算器应用程序
  3. 为运行IBM Integration Bus的服务器指定合适的主机名端口号值。 例如,如果您在与Calculator应用程序相同的机器上运行IBM Integration Bus,并且使用缺省端口,则这些值将为localhost和7800 。
  4. 修改服务的路径,将其值设置为/ MathServer / services / MathServer / eplookup1 。 这是EndpointLookup_Basic流的端点
  5. 在下拉列表中指定一些值和合适的运算符(+,-,/,*),然后按=按钮。
  6. 计算器应用程序将服务请求发送到服务位置消息流,该服务请求消息流会将其路由到Math Service 。 然后,该响应将返回到显示应用程序的计算器应用程序。 计算器应用程序应类似于以下内容:
    计算器应用程序,设置为使用服务位置消息流
    计算器应用程序,设置为使用服务位置消息流

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

  1. 您已经执行了系列文章第1部分:场景和配置中描述的所有配置步骤。
  2. 您指定了正确的主机名。
  3. 您指定了正确的端口号。
  4. 您已经为流指定了正确的路径。

服务选择业务场景

服务选择方案是服务位置方案的扩展。 在第1部分:场景和配置中对此进行了描述,如下所示:

  • 业务问题

    已经定义了股票报价服务的接口,但是已经部署了三个实现。 一种实现方式返回最新的股票报价,并且仅应由Gold客户使用。 另一个实现返回5分钟前的报价,并且仅应由Silver客户使用。 最终实现将返回20分钟前的报价,并且仅供青铜客户使用。 股票报价服务的消费者希望能够使用单个端点来调用它。

  • 可以在WSRR中注册所有这三个服务的端点,并且其他元数据可以与每个端点关联。 例如,在上述场景中,您可以在WSRR中定义一个自定义本体,该本体允许您将每个端点分类为GoldSilverBronze 。 当在运行时通过消息流检索端点时,元数据也将返回给IBM Integration Bus。 然后,消息流可以使用此元数据来决定应将请求路由到哪个端点,这可能与原始请求中可用的某些信息或ESB中可用的上下文信息结合在一起。

  • 好处

    通过这种方法,您可以在运行时基于关于那些提供程序的元数据在多个服务提供程序之间进行选择。 路由决策可能会受到原始请求中可用信息的影响,有时也称为基于内容的路由。 可替代地,该决定可以完全基于关于目标端点的元数据。 例如,您环境中的监视组件可能会将性能指标推送到WSRR中,并且消息流可能决定将请求路由到具有最低平均响应时间的端点。

服务选择消息流

服务选择消息流(如中所示)使用Endpoint Lookup节点在运行时从WSRR检索目标服务的所有在线端点。 然后,它选择一个端点,并将服务请求转发到该端点。

从中可以看到,服务选择消息流与服务位置消息流非常相似。 因此,在以下各节中仅描述实现中与服务位置消息流不同的那些方面。

服务选择消息流
服务选择消息流

服务请求节点

服务选择消息流的“ Service Request SOAP输入”节点被配置为使用HTTP传输,其URL后缀为/ MathServer / Services / MathServer / eplookup2 。 这是消费者在调用此流程公开的服务时需要使用的值。

端点查找节点差异

此流中的“ Endpoint Lookup节点的配置与服务位置消息流的配置几乎相同。 唯一的区别是在节点上配置的匹配策略All 。 这是一个重要的区别,因为这意味着节点将不会自动为本地环境树中的Destination.HTTP.RequestURLDestination.SOAP.Request.Transport.WebServiceURL元素设置值。 如果要将请求转发到SOAP RequestHTTP Request ,则必须在消息流的后面由计算节点以编程方式完成此操作。 正是在服务选择消息流中完成了此操作,将“ Endpoint Lookup节点的out终端连接到“ Endpoint Selector Java”计算节点。

端点选择器节点

Endpoint Selector节点是Java Compute节点的一个实例。 顾名思义,此节点处理由“ Endpoint Lookup节点执行的查询结果,选择将服务请求转发到的端点。 服务选择消息流已经通过仅检索WSRR中分类为“ 在线”Math Service端点来执行选择级别。 在“ Endpoint Lookup节点本身上将其配置为“ 分类”属性。

端点选择器节点
端点选择器节点

如上文在“ 服务选择”业务场景中讨论的那样,您可以基于与对象关联的元数据来选择端点。 通常,您检查端点上的分类以选择适当的分类。 但是,这留给您作为练习,服务选择消息流仅在运行时选择返回的端点之一。

此过程的第一步是检索“ Endpoint Lookup节点从WSRR中检索的联机端点的列表。 将它们放置在ServiceRegistry条目中的本地环境树中。 中的代码显示了如何从此位置检索端点地址列表:

检索端点地址列表
MbElement rootElement = inAssembly.getLocalEnvironment().getRootElement();
MbElement serviceRegistry = rootElement.getFirstElementByPath("/ServiceRegistry");
List<MbElement> addresses = 
    (List <MbElement>)serviceRegistry.evaluateXPath("ITService/Endpoint/Address");

下一步是假设存在多个端点,从列表中随机选择一个端点地址。 中的代码显示了如何执行此操作。 值得注意的是,必须至少有一个地址可用。 如果“ Endpoint Lookup节点尚未从WSRR检索任何结果,则该消息将绕过“ Endpoint Selector节点通过NoMatch终端进行路由。

随机选择端点地址
int index = 0;
if (addresses.size() > 1) {
    Random random = new Random();
    index = random.nextInt(addresses.size());
}
String addressUrl = (String)addresses.get(index).getValue();

选择端点地址后,“ Endpoint Selector节点需要将服务请求转发到目标服务上。 为此,服务选择消息流使用称为Forward RequestSOAP Request节点。 要以编程方式覆盖在“ Forward Request节点上配置的Web服务URL ,“ Endpoint Selector节点需要将端点地址插入本地环境树的Destination.SOAP.Request.Transport.HTTP.WebServiceURL字段中。 显示执行此任务所需的代码。 然后,“ Endpoint Selector节点将消息传递到输出终端,该终端连接到“ Forward Request节点。

将地址放入本地环境树
MbMessage environment = new MbMessage(inAssembly.getLocalEnvironment());
MbElement environmentRoot = environment.getRootElement();

environmentRoot.evaluateXPath("?Destination/?SOAP/?Request/?Transport/?"
    + "HTTP/?WebServiceURL[set-value('" + addressUrl + "')]");
   
environmentRoot.evaluateXPath("?Destination/?HTTP/?RequestURL[set-value('"
    + addressUrl + "')]");
                
outAssembly = new MbMessageAssembly( inAssembly
                                   , environment
                                   , inAssembly.getExceptionList()
                                   , inAssembly.getMessage()
                                   );

测试服务选择消息流

接下来的步骤描述了如何使用计算器应用程序来验证服务选择消息流是否正常运行。

使第二个端点联机

在本系列文章中提供的测试数据中, Math Service的 1.0版实际上具有在WSRR中注册的两个端点,如中所示。

数学服务v1.0端点
数学服务v1.0端点

您会注意到,端点之一实际上是一个虚拟端点,其URL为http://dummy.endpoint:7800 / MathServer2 / services / MathServer 。 该端点当前被分类为“ 脱机” ,因此在测试上述服务位置消息流时未返回。 为了证明服务选择消息流正常工作,您需要将此端点的状态更改为联机。 接下来的步骤描述了如何执行此操作。

  1. 在Web浏览器中,登录到WSRR实例的Service Registry Dashboard
  2. 切换到SOA治理视图,然后选择Overview页面。
  3. 在“ 集合”小部件中选择“ SLA-CalculatorApplication 1.0到MathService 1.0 ”,如下所示:
    SOA治理视图
    SOA治理视图
  4. 您将被带到“ 浏览”页面,该页面将在“ 细节”小部件中显示SLA-CalculatorApplication 1.0到MathService 1.0服务级别协议的详细信息 。 这表示WSRR中Calculator应用程序和Math Service之间的使用协议。 在此小部件中,在“ 商定的端点”下 ,选择SLD-MathService v1.0
  5. 详细信息小部件将被更新以显示SLD-MathService v1.0 SLD的详细信息。 在“ 细节”小部件中的“ 可用端点”下,选择http://dummy.endpoint:7800 / MathServer2 / services / MathServer(1.0)
  6. 详细信息窗口小部件将更新为显示http://dummy.endpoint:7800 / MathServer2 / services / MathServer‪(1.0)端点的详细信息。 选择操作=>批准使用 ,如下所示:
    批准使用
    批准使用
  7. 操作完成后,单击“ 确定 ”。 现在,端点的治理状态为Online

测试消息流

  1. 确保您的IBM Integration Bus执行组正在运行,并且已部署并启动EndpointLookup_EndpointSelection流。
  2. 第1部分中的运行计算器应用程序中所述, 启动计算器应用程序
  3. 为运行IBM Integration Bus的服务器指定合适的主机名端口号值。 例如,如果您在与Calculator应用程序相同的机器上运行IBM Integration Bus,并且使用缺省端口,则这些值将为localhost和7800 。
  4. 修改服务的路径,将其值设置为/ MathServer / services / MathServer / eplookup2 。 这是EndpointLookup_EndpointSelection流的端点
  5. 在下拉列表中指定一些值和合适的运算符(+,-,/,*),然后按几次=键。
  6. 数学服务的某些调用将起作用,并且将显示结果。 某些调用失败, 计算器应用程序显示消息错误:无法调用数学服务 ,如下所示。 这是预料之中的,因为刚刚在WSRR中联机的端点是虚拟端点。 您应该大约有50%的时间看到错误。
    计算器应用程序,设置为使用服务选择消息流
    计算器应用程序,设置为使用服务选择消息流

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

  1. 您已经执行了第1部分:场景和配置中描述的所有配置步骤。
  2. 您指定了正确的主机名。
  3. 您指定了正确的端口号。
  4. 您已经为流指定了正确的路径。

备用服务提供商业务场景

备用服务提供者是服务选择方案的扩展,在第1部分中对此进行了描述,如下所示:

  • 业务问题

    多个端点可用于目标服务,但是尝试调用所选端点时会发生错误。 服务的使用者仅知道代理该​​服务的消息流的终结点。 他们希望ESB能够透明地处理问题端点周围的路由请求。

  • 可以在WSRR中注册目标服务的所有端点,并在单个查询中通过消息流进行检索。 如果尝试在所选端点上调用目标服务时发生错误,则消息流可以简单地选择该服务的其他端点之一并重试。 消息流可以继续此过程,直到请求成功或尝试了所有服务端点为止。

  • 好处

    通过允许ESB透明地围绕问题端点路由服务请求,此方法使您能够在ESB中建立一定程度的容错能力。 您可能决定允许消息流尝试服务的所有可用端点,或者,您可能决定限制在将错误返回给服务使用者之前尝试的端点数量。 显然,ESB中内置的所有容错功能都必须与环境中使用的其他高可用性机制一起使用。

备用服务提供商消息流

备用服务提供者消息流(如中所示)使用Endpoint Lookup节点在运行时从WSRR检索目标服务的所有联机端点。 然后,它从列表中选择第一个端点,并尝试将服务请求转发给它。 如果尝试使用所选的第一个端点调用目标服务时发生错误,则消息流将尝试列表中的下一个端点。 如果没有端点可尝试,它将返回错误。

从中可以看到,备用服务提供者消息流与服务选择消息流非常相似。 因此,在以下各节中仅描述实现中与服务选择消息流不同的那些方面。

备用端点选择器消息流
备用端点选择器消息流

服务请求节点

备用服务提供者消息流的“ Service Request SOAP输入”节点被配置为使用HTTP传输,其URL后缀为/ MathServer / Services / MathServer / eplookup3 。 这是消费者在调用此流程公开的服务时需要使用的值。

备用端点选择器节点

Alternate Endpoint Selector节点是Java Compute节点的一个实例。 它以与服务选择消息流中的“ Endpoint Selector节点略微不同的方式处理“ Endpoint Lookup节点执行的查询结果。

备用端点选择器节点
备用端点选择器节点

节点执行的第一个任务是检索“ Endpoint Lookup节点从WSRR中检索的联机端点的列表。 然后提取每个端点的实际地址,并将其放入列表中。 如图所示。

检索端点地址列表
MbElement rootElement = inAssembly.getLocalEnvironment().getRootElement();
MbElement serviceRegistry = rootElement.getFirstElementByPath("/ServiceRegistry");

List<MbElement> addresses = 
    (List <MbElement>)serviceRegistry.evaluateXPath("ITService/Endpoint/Address");
    
List<String> addressUrls = new ArrayList<String>();
for (MbElement address : addresses) {
    addressUrls.add((String)address.getValue());
}

下一步是检查在之前通过节点的过程中是否已经选择了端点。 如果是这种情况,先前选择的端点的地址将存储在本地环境树的Destination.SOAP.Request.Transport.WebServiceURL元素中。 在这种情况下,“ Alternate Endpoint Selector节点可以在地址列表中找到先前选择的端点,然后只需在列表中选择下一个地址,并检查以确保其尚未到达列表的末尾。 显示了如何执行此操作。 如果尝试了所有地址,则将生成SOAP错误,并且节点会将消息传递给故障终端。 该终端直接连接到SOAP Reply节点,该节点将SOAP故障传递回客户端。

选择端点地址
String webServiceUrl = null;

MbElement webServiceUrlElement = rootElement.getFirstElementByPath(
    "/Destination/SOAP/Request/Transport/HTTP/WebServiceURL");

if (webServiceUrlElement != null) {
    webServiceUrl = (String)webServiceUrlElement.getValue();
}

int index = 0;
if (webServiceUrl != null && addressUrls.contains(webServiceUrl)) {
    index = addressUrls.indexOf(webServiceUrl) + 1;
}

if (index < addressUrls.size()) {
    String addressUrl = addressUrls.get(index);
    
    ...
    
} else {
    outAssembly =
        MessageUtils.createSOAPFault(inAssembly
                                    , "ERROR_EP_002"
                                    , "It is not possible to process the request."
                                    , "All of the available endpoints for the service "
                                    + "have been tried (" + addressUrls.size() + ") and "
                                    + "none of them succeeded."
                                    );
    outputTerminal = getOutputTerminal("failure");
}

选择端点地址后,“ Alternate Endpoint Selector节点会将服务请求转发到目标服务。 执行此操作所需的代码与上面显示的“ Endpoint Selector节点所使用的代码相同。 然后, Alternate Endpoint Selector节点将消息传递到输出终端,该终端连接到Forward Request节点。

转发请求节点

与备用服务提供者消息流中的“ Forward Request节点的唯一区别在于,其故障终端被连线回“ Alternate Endpoint Selector节点的“ 输入”终端。 如果它将尝试将请求转发到虚拟端点,则消息流将通过“ Alternate Endpoint Selector节点返回并选择列表中的下一个端点。 当然,在实际情况下,如果调用原始端点时返回了SOAP错误,则您可能还想选择一个备用端点。 在这种情况下,您需要将“ Forward Request节点的“ 故障”端子连接回“ Alternate Endpoint Selector节点的“ 输入”端子。

测试备用服务提供商消息流

接下来的步骤描述了如何使用计算器应用程序来验证备用服务提供商消息流是否正常运行。

  1. 确保您的IBM Integration Bus执行组正在运行,并且已部署并启动EndpointLookup_AlternateEndpoint消息流。
  2. 第1部分中的运行计算器中所述,启动计算器应用程序。
  3. 为运行IBM Integration Bus的服务器指定合适的主机名端口号值。 例如,如果您在与Calculator应用程序相同的机器上运行IBM Integration Bus,并且使用缺省端口,则这些值将为localhost和7800 。
  4. 修改服务的路径,将其值设置为/ MathServer / services / MathServer / eplookup3 。 这是EndpointLookup_AlternateEndpoint流的端点
  5. 在下拉列表中指定一些值和合适的运算符(+,-,/,*),然后按=按钮。
  6. 计算器应用程序将服务请求发送到备用服务提供商消息流,该消息流会将其路由到Math Service 。 如果首先选择了虚拟端点,则消息流将接收到一个错误,并将透明地将请求转发到该服务的真实端点。 然后,该响应将返回到显示应用程序的计算器应用程序。

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

  1. 您已经执行了第1部分中描述的所有配置步骤。
  2. 您指定了正确的主机名。
  3. 您指定了正确的端口号。
  4. 您已经为流指定了正确的路径。

使第二个端点脱机

如果您打算按照本系列其他文章中介绍的消息流进行操作,那么此时将虚拟端点的状态更改回“ 脱机”很重要。 为此,请按照中所述的步骤进行操作,但是当转到步骤7时,请选择操作=>使用中撤消

结论

本文介绍了许多消息流,这些消息流都是服务虚拟化模式的所有实现。 这些模式可用于帮助您实现SOA中服务使用者和服务提供者之间的松散耦合,使您可以将请求路由到一个或多个提供者端点,并在服务使用者不知情的情况下透明地处理错误。

致谢

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

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

作者还感谢以下人员对本文的帮助:

  • 戴维·西格
  • 阿尔诺·德斯普雷特
  • 安娜·麦克西科维奇(Anna Maciejkowicz)

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

语音端点检测解决方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值