SOAP Web服务回调架构?(SOAP web service callback architec

2019-07-21 05:35发布

我很新的Web服务,JAX-WS等,所以也许noob问题...

所以,我想实现一个Web服务,使两个系统进行通信。 “客户端”系统感兴趣的是,在“服务器”系统上生成的事件。 但“客户端系统”本​​身就是一个不同的应用程序的服务器。 该服务器是爪哇(在Tomcat中WAR)。 客户端是.NET。

目前应该只有一个客户端系统,但一些客户端程序在客户端系统中,每一个感兴趣的不同类别的事件。

我将实现服务器端和测试客户端。 别人会实现的.Net代码。

正在运行的顺序应沿这条线:

  1. 服务器正在运行...
  2. 客户端发起的谈话,“注册”到服务器,并请求一些初始数据。
  3. Server保留注册客户端点的列表
  4. 在服务器出现当某些事件发生的通知的监听器。 然后,它会经过注册的客户名单和事件转发到他们每个人
  5. 在某些时候,客户端可以通过“注销”没有通知,它不希望接收事件的任何更多的服务器。

首先,它听起来像一些合理可行?

而且是有一个标准的内置机制,使用SOAP(在服务器上的JAX-WS,无论是可与.net n个客户端) - 服务器可以用来获取来自客户端的回调端点?

例如,我使用RMI做了非常类似的事情,在这种情况下,客户只需发送一个远程引用本身,即服务器可以只存储蚂蚁参考版本。

最后,有没有存放端点引用,使(集体)的回调,也许保持列表上最新,去除不回应这样一些“平”致电客户一个标准库?

注意为清楚起见,我需要的不仅仅是异步方法更具有回调:从客户端一个消息会产生许多回调消息从服务器到客户端。

Answer 1:

看来你希望实现通知工具通知任意匿名客户端。

我建议你首先考虑你将如何使用通过SOAP消息的信息。 然后你就可以考虑如何实现这一目标用java - JAX-WS或附加的非标准库。 问题的关键是有可能传递的SOAP消息需要显著限制或假设。 例如,防火墙可能会阻止你的HTTP消息,客户端可能“只是客户”没有能力的服务器角色采取行动,收到SOAP请求的通知

注意:一个异步回调机制在JAX-WS 2.0,其中,所述服务获得的客户机的端点引用定义。 这是相同的排序由人Deepak巴拉描述的WebLogic /融合专有解决方案提供的功能。 WebSphere有类似的专有异步解决方案。 这些都不符合你的要求,因为他们只允许每个请求的单个响应。

SOAP选项:

  1. 专有SOAP消息 - “100%的人自己动手选项”

    你设计充分SOAP有效载荷模式和消息交换模式。

    如果你知道客户端的SOAP端点地址,你可以把从服务器到客户端的通知。 客户端可以原来的SOAP请求有效载荷内不转让其的SOAP端点地址。 一段时间后,服务器可以发送SOAP请求发送到客户端。

    问题/假设:(1)需要用于从请求SOAP / HTTP通信路径服务器到客户端 - 当防火墙存在不能保证; (2)客户需要知道您的通知模式 - 事实上,客户端需要充当服务端点收到通知用SOAP请求。 这是两个大的假设,如果你是想支持任意匿名客户端 - 这是不是SOAP“只是支持”两端需要设计这一切的细节。 事实上,在一个服务类型安全的方式做到这一点,客户实际上应该声明它自己的服务WSDL接口,这样就可以调用它。 (3)如先前暗示,许多客户都是“只是客户” - 他们可能没有一个HTTP服务器接受SOAP请求。

    因此,对于专有的“推”通知上班,双方都需要服务器和两个需要发布自己的SOA接口。

    或者,你可以拉通知到客户端。 客户端可以使用的通知请求,以要么是阻断或轮询服务器。 该服务器可以通知或没有或错误响应。

    问题/假设:(1)HTTP服务器(即SOAP服务器)不支持阻止请求,作为一项规则,这意味着你必须查询; (2)客户需要知道您的通知模式 - 事实上,客户端需要充当服务端点收到通知用SOAP请求。 这是两个非常大的假设,对于任意匿名客户 - 这是不是SOAP“只是支持”两端需要设计这一切的细节。 事实上,在一个服务类型安全的方式做到这一点,客户实际上应该声明它自己的服务WSDL接口,这样就可以调用它。

  2. 同上,但要包含WS-Addressing在SOAP头数据,告知对方的端点地址的两侧。

    基本上同样的问题/假设作为第一个选项。 WS寻址地址将帮助您智能地将SOAP消息发送到正确的URL地址,但没有更多。

  3. 使用WS-通知

    这种规范的目的是为您的方案。
    WS-BaseNotification之上的子标准将满足您的需求。 它提供了通知生产者和消费者WSDL端口定义。 它提供了订制了生产WS-符合标准的解决方案,从消费者,并从生产者到消费者的通知。

    问题/限制:(1)它没有定义通知的有效载荷的格式。 通知有效载荷是应用结构域特异性(专有设计)。 该标准没有定义任何“标准”或“内置”的通知的情况或消息。 (2)它具有与通过HTTP通知通过防火墙与上述同样的问题。 (3)的WS-Notification不是Java EE /的支持的标准JAX-WS(但也有很多的应用服务器,开源和商用,支持它作为一个扩展的)。

  4. 使用消息队列的解决方案(例如JMS)封装在HTTP流量这就需要客户端和服务器之间的回传球有效载荷的专利设计 - 形成双方之间的合同。 一个优点是,所述客户端可以是一个纯客户,具有在一个线程调用的消息侦听器时,收到的消息。

    问题/限制:(1)它具有与通过HTTP通知通过防火墙与上述同样的问题。 (2)是做自己动手实施。 (3)使用更多的技术,那么你目前使用的。

最终结果:
你需要你的解决方案至少部分是一个专有的设计 - SOAP / WS标准不能满足您的全部要求。 在理论上,这专利设计,可以充分利用产品提供多跑腿的,但通知架构设计将需要创建和你整合。

如果你想推送通知,你需要某种形式合同,以传递给客户端,客户端需要充当SOA服务器的通知,而你需要的防火墙openned为您的流量。 大多数公司禁止HTTP请求留下一个服务器,并传递到客户端 - 你通常需要一个非常好的理由来打开防火墙端口,即使这样,许多企业将不允许它...

如果你想有通知客户查询,你只需要在服务器端,可以经常被客户端调用一个基本的WSDL接口。

期货期权:HTML5的Web套接字
如果你的客户是一个HTML5应用,那么网络套接字启用服务器可以推动交通到浏览器 - 而有一些机会的企业将打开防火墙。 SOAP消息可以旅行通过HTTP网络插座,使您能够推送通知。



Answer 2:

异步客户端通过使用支持基于WSDL服务轮询和回调 。 你的情况,我认为需求是相对比较复杂。

Oracle融合中间件文档页面概述了一个方案,这将帮助你。 它详细的方法,其允许客户端发送该生成的HTTP 202请求(接受)和客户端然后等待消息队列的响应。 你的情况的情况下可以从下图所示进行调整。

发起回调的每个类别几个响应队列。 客户可以通过队列提供客户端和类别ID过滤。 这将作为一个回调机制为每个客户端或在每个客户端管辖下的过程。 该MDB可以通过一个文件存储或DB存储被备份,以确保可靠性和一次性交货。

当然,你不需要甲骨文fusionware来实现这一点。 您可以使用RabbitMQ的或Redis的(与交易),以确认收到客户端的消息。 如果您的客户端希望取消其注册拨打电话,并停止监听到队列中。

我不知道有什么行业标准,将适合您的方案,但我相信这个解决方案应该为你工作。



Answer 3:

你有没有考虑使用通讯产品“发布 - 订阅”的简单的方法? (如MQ,EMS,或ActiveMQ的)

您所描述的要求似乎并不符合“经典”请求/应答同步/异步SOAP Web服务的场景。

在发布/订阅解决方案,客户端(或多个)订阅一个主题一次,发布者(S)(在你的情况下,服务器)可以张贴到所有用户的任何数量的相关信息。

作为奖励,最通讯产品包括“长期订阅”支持,所以客户端可以是离线的时间和重新连接后收到的所有邮件。

在你的情况下,服务器可以容纳一个(免费)的ActiveMQ服务器...提供了最你似乎寻求功能。

如果你走那条路,我建议你选择一个符合JMS产品,对.NET的支持。



Answer 4:

对于那些从搜索引擎到达这里:

您可以使用的Web API的时下网络挂接,为OP描述的基本工作。

在REST例如,客户端将具有被专用于接收从实际的服务器POST事件/通知HTTP端点本身。 客户端通过给它一个URI他通知终结他的登记与实际服务器端点。 从这一点上,实际的服务器可以发布到客户端的通知端点。 它本质上是一个令人费解的回调,如果你熟悉异步术语。

也许Java或.NET现在有网络挂接库。

这就是说,SSE和WebSockets的标准提供实际的推动和实时信息,同时与HTTP和大多数浏览器兼容。

长轮询的变化也被用来在过去,而现在有时被称为彗星作为骨料。



文章来源: SOAP web service callback architecture?