我有以下情况。一些服务主要通过SOAP接口提供其功能。有一个模块想要使用此功能来集成到网站中。这样做的最佳做法是什么?
服务的功能可能会有所变化。因此,每个单一的功能/方法应该是“可重新路由的”。 Web服务可能托管在不同的计算机上。
将所有Web服务映射到JMS队列是否合理(我的第一个想法)?网站模块只会与JMS通信。路由器会将所有传入的JMS消息路由到不同的Web服务(或其他地方)。
或者:可能有一个专用的Web服务,它集成了所有功能,仅供网站使用?这里的优点是键入参数和返回值。
你会建议什么?什么可能是另一种更好的方法?
答案 0 :(得分:2)
如果我理解正确,那么您的目标是为您的webapp模块提供一个同构的接口,一个连贯的API,为多个远程接口(主要是SOAP接口)提供外观的目的。
关于你提到的JMS方法 - 这似乎是合理的,但是:
而不是很多队列,我宁愿选择一个JMS目的地,在队列之后立即使用基于Camel内容的路由器(或两个队列用于请求/回复模式)这会使事情“重新路由”并且孤立服务中的Web模块发生了变化。
您的请求不太容易出现与服务相关的错误,服务可用性等方面的简短问题,同时仍然保留执行请求/回复样式调用的能力(这是RPC的RPC特性) 。
我会在适用的地方使用单向样式调用(以提高可靠性和反应性)。
您不应该担心缺少输入,WSDL + SOAP似乎强制执行强类型,但这是由自动生成的存根驱动的错觉。您仍然需要来回编组数据。
而不是SOAP,我会使用JSON,因为它比XML更清晰,更少冗余(可能更快,但通常不相关)。 Jackson 是一个非常高效的JSON库,它已经在Camel发行版中得到支持。 JMS ObjectMessage
是一个很大的 NO (a good article on some of the ObjectMessage
pitfalls )
单一服务方法似乎是将Web模块与服务层分离的好方法。它缺乏JMS方法的灵活性和容错性,但似乎更容易实现。
如果有许多可以单向结束的调用,我会说使用JMS并在队列之后重新路由消息。