12.6. 以 Decoupled 模式使用 HTTP 传输


概述

在正常的 HTTP 请求/响应场景中,请求和响应使用相同的 HTTP 连接发送。服务提供程序处理请求,并响应包含相应 HTTP 状态代码和响应的响应。如果请求成功,HTTP 状态代码被设置为 200。

在某些情况下,比如使用 WS-RM 或请求执行延长的时间时,最好分离请求和响应消息。在这种情况下,服务供应商通过收到请求的 HTTP 连接的后端通道向消费者发送 202 Accepted 响应。然后,它会处理请求,并使用新的分离的服务器→client HTTP 连接将响应发回给消费者。消费者运行时接收传入的响应,并在返回应用程序代码前将其与适当的请求相关联。

配置分离的交互

在分离的模式中使用 HTTP 传输需要您执行以下操作:

  1. 将消费者配置为使用 WS-Addressing。

    请参阅 “配置端点以使用 WS-Addressing”一节

  2. 将消费者配置为使用分离的端点。

    请参阅 “配置消费者”一节

  3. 配置使用者与 交互以使用 WS-Addressing 的任何服务提供商。

    请参阅 “配置端点以使用 WS-Addressing”一节

配置端点以使用 WS-Addressing

指定消费者与之交互的消费者和服务供应商使用 WS-Addressing。

您可以使用两种方式之一指定端点使用 WS 寻址:

  • wswa:UsingAddressing 元素添加到端点的 WSDL 端口 元素中,如 例 12.19 “使用 WSDL 激活 WS-Addressing” 所示。

    例 12.19. 使用 WSDL 激活 WS-Addressing

    ...
    <service name="WidgetSOAPService">
      <port name="WidgetSOAPPort" binding="tns:WidgetSOAPBinding">
        <soap:address="http://widgetvendor.net/widgetSeller" />
        <wswa:UsingAddressing xmlns:wswa="http://www.w3.org/2005/02/addressing/wsdl"/>
      </port>
    </service>
    ...
  • 将 WS-Addressing 策略添加到端点的 WSDL 端口 元素中,如 例 12.20 “使用策略激活 WS-Addressing” 所示。

    例 12.20. 使用策略激活 WS-Addressing

    ...
    <service name="WidgetSOAPService">
      <port name="WidgetSOAPPort" binding="tns:WidgetSOAPBinding">
        <soap:address="http://widgetvendor.net/widgetSeller" />
        <wsp:Policy xmlns:wsp="http://www.w3.org/2006/07/ws-policy"> <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata"> <wsp:Policy/> </wsam:Addressing> </wsp:Policy>
      </port>
    </service>
    ...
注意

WS-地址策略取代 wswa:UsingAddressing WSDL 元素。

配置消费者

使用 http-conf:conduit 元素的 DecoupledEndpoint 属性将消费者端点配置为使用分离的端点。

例 12.21 “将 Consumer 配置为使用 Decoupled HTTP 端点” 显示设置 例 12.19 “使用 WSDL 激活 WS-Addressing” 中定义的端点以使用分离端点的配置。消费者现在接收 http://widgetvendor.net/widgetSellerInbox 的所有响应。

例 12.21. 将 Consumer 配置为使用 Decoupled HTTP 端点

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:http="http://cxf.apache.org/transports/http/configuration"
       xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
                             http://cxf.apache.org/schemas/configuration/http-conf.xsd
                           http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans.xsd">

  <http:conduit name="{http://widgetvendor.net/services}WidgetSOAPPort.http-conduit">
    <http:client DecoupledEndpoint="http://widgetvendor.net:9999/decoupled_endpoint" />
  </http:conduit>
</beans>

如何处理消息

在分离模式下使用 HTTP 传输可为处理 HTTP 消息增加额外复杂性。虽然增加的复杂性对应用中的实施级别代码是透明的,但了解调试的原因可能很重要。

图 12.1 “用于 Decoupled HTTP 传输的消息流” 在分离模式下使用 HTTP 时显示消息流。

图 12.1. 用于 Decoupled HTTP 传输的消息流

分离的消息交换中有五步。

请求启动以下流程:

  1. 消费者实施调用一个操作,并且生成了请求消息。
  2. WS-地址层将 WS-A 标头添加到消息。

    当在消费者配置中指定分离端点时,分离的端点的地址会被放在 WS-A ReplyTo 标头中。

  3. 消息发送到服务提供商。
  4. 服务提供程序接收消息。
  5. 来自消费者的请求消息被分配给供应商的 WS-A 层。
  6. 由于 WS-A ReplyTo 标头没有设置为匿名,因此提供程序会发回一个 HTTP 状态代码设为 202 的信息,并确认了收到了该请求的信息。
  7. HTTP 层使用原始连接的后备通道将 202 Accepted 消息发回到消费者。
  8. 消费者在用于发送原始消息的 HTTP 连接的 back-channel 上接收 202 Accepted 回复。

    当消费者收到 202 Accepted 回复时,HTTP 连接将关闭。

  9. 请求传递到处理请求的服务提供商的实现。
  10. 当响应就绪时,它将被分配给 WS-A 层。
  11. WS-A 层将 WS-Addressing 标头添加到响应消息。
  12. HTTP 传输将响应发送到消费者的分离端点。
  13. 消费者分离的端点从服务提供商接收响应。
  14. 响应被分配给消费者的 WS-A 层,其中使用 WS-A RelatesTo 标头将其与正确的请求关联。
  15. 关联的响应返回给客户端实施,调用的调用将被取消阻塞。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.