Web services apachecamel聚合多个REST服务响应

Web services apachecamel聚合多个REST服务响应,web-services,rest,apache-camel,esb,aggregation,Web Services,Rest,Apache Camel,Esb,Aggregation,我刚接触骆驼,不知道如何使用骆驼实现下面提到的用例 我们有一个RESTWeb服务,假设它有两个服务操作callA和callB。 现在,我们在前面有了ESB层,它在访问这个实际的web服务URL之前拦截客户机请求 现在我正试着做这样的事情- 在ESB中公开客户端将实际调用的URL。在ESB中,我们使用的是Camel的Jetty组件,它只是代理此服务调用。让我们假设这个URL是/my service/scan/ 现在,在接收到这个请求@ESB后,我想调用这两个REST端点(callA和callB)-

我刚接触骆驼,不知道如何使用骆驼实现下面提到的用例

我们有一个RESTWeb服务,假设它有两个服务操作callA和callB。 现在,我们在前面有了ESB层,它在访问这个实际的web服务URL之前拦截客户机请求

现在我正试着做这样的事情- 在ESB中公开客户端将实际调用的URL。在ESB中,我们使用的是Camel的Jetty组件,它只是代理此服务调用。让我们假设这个URL是/my service/scan/

现在,在接收到这个请求@ESB后,我想调用这两个REST端点(callA和callB)->获取它们的响应-resA和resB->将其聚合到单个响应对象resScan->返回到客户端

我现在只有-

<route id="MyServiceScanRoute">
<from uri="jetty:http://{host}.{port}./my-service/scan/?matchOnUriPrefix=true&amp;bridgeEndpoint=true"/>
<!-- Set service specific headers, monitoring etc. -->  
<!-- Call performScan -->
<to uri="direct:performScan"/>
</route>

<route id="SubRoute_performScan">
<from uri="direct:performScan"/>
<!--  HOW DO I??
Make callA, callB service calls. 
Get their responses resA, resB.
Aggregate these responses to resScan
 -->
</route>

这看起来是一个应该使用内容丰富器模式的好例子

因此,现在由您将请求与来自enrich服务调用的响应合并起来。你必须做两次,因为你有callA和callB。有两种预定义的聚合策略可能有用,也可能不有用,即UselateStaggegationStrategy和UseOriginalAggregationStrategy。这些名字很能自我解释


祝你好运

我认为你不必要地把解决方案复杂化了一点。:)在我看来,调用两个独立的远程web服务并连接结果的最佳方法是:

  • 并行呼叫服务使用
  • 使用
上述解决方案的路由可能如下所示:

from("direct:serviceFacade")
  .multicast(new GroupedExchangeAggregationStrategy()).parallelProcessing()
    .enrich("http://google.com?q=Foo").enrich("http://google.com?q=Bar")
  .end();
传递到
direct:serviceFacadeResponse
的Exchange将包含属性
Exchange。分组的\u Exchange
设置为调用您的服务的结果列表(在我的示例中为谷歌搜索)

这就是如何将
direct:serviceFacade
连接到Jetty端点:

from("jetty:http://0.0.0.0:8080/myapp/myComplexService").enrich("direct:serviceFacade").setBody(property(Exchange.GROUPED_EXCHANGE));
现在,您使用Jetty组件在ESB上公开的对服务URL的所有HTTP请求都将生成连接到两个子服务调用的响应

关于消息和端点的动态部分的进一步考虑

在许多情况下,在端点中使用静态URL不足以实现所需的功能。在将负载传递给每个web服务之前,您可能还需要准备负载

一般来说,用于实现动态端点或有效负载参数的路由类型高度依赖于用于使用web服务的组件(、、RSS等)。每个组件的程度和动态配置方式各不相同

<>如果你的端点/有效载荷动态地受到影响,你也可以考虑以下选项:

使用多播端点的
onPrepareRef
选项预处理传递给每个端点的exchange副本。您可以使用它来引用自定义处理器,该处理器将在将负载传递到多播的端点之前修改负载。这可能是使用HTTP组件的Exchange.HTTP_URI头编写onPrepareRef的好方法

使用(与多播一样,它也提供了
并行处理
)动态创建REST端点URL

使用模式(启用了
并行处理
)将请求拆分为专用于每个服务的较小消息。这个选项同样可以很好地与HTTP组件的
Exchange.HTTP_URI
头配合使用。只有当两个子服务都可以使用相同的端点类型定义时,这才有效

正如你们所看到的,骆驼是非常灵活的,它为你们提供了很多方式来实现你们的目标。考虑你的问题的背景,选择适合你的解决方案。


如果您向我展示您希望在每个聚合服务请求中调用的REST URL的更多具体示例,我可以建议您选择哪个解决方案以及如何实现它。特别重要的是要知道请求的哪一部分是动态的。我还需要知道您想要使用哪种服务消费者(这取决于您将从服务中收到的数据类型)。

谢谢您的指点!非常感谢。让我开始阅读abt的内容Enricher模式以及类似的内容。在与团队进行了一轮讨论后,我们发现Enricher选项的成本很高,因为它是连续的(而且我们可能有两个以上的服务调用)。现在我正在评估使用-1的选项。组合消息处理器EIP/拆分器聚合器2。或分散收集EIP 3。或收件人列表,带有授权策略,是否有任何输入?哪一个最适合这个用例?问题是将请求和聚合响应保持在同一个路由中,因为您想要回复HTTP调用。最吸引人的选择似乎是recipientList,它指定了聚合策略,“ParallelProcessing”选项设置为true。棘手的部分是编写聚合策略,因为它可能以任何顺序接收答案。我对有效载荷一无所知,但它应该是相当直接的。提供了一些如何聚合多个响应的示例,例如,一系列响应中的最大数量。在多播模式和收件人列表模式中,“同一”消息被路由到多个使用者。但在本例中,两个不同的web服务调用(callA和callB)是完全不同的。因此,我将尝试类似的方法-是的,这听起来很合适,因为调用中的负载不同,而不仅仅是URL。无论如何,你不能过度使用骆驼的“直接”交通工具。这是非常有用的,因为它允许这样做,模块化您的路由,建立可重用的子路由等。开销只是一个方法调用(或者,他们说是这样)。感谢您的帮助
from("direct:serviceFacade")
  .multicast(new GroupedExchangeAggregationStrategy()).parallelProcessing()
    .enrich("http://google.com?q=Foo").enrich("http://google.com?q=Bar")
  .end();
from("jetty:http://0.0.0.0:8080/myapp/myComplexService").enrich("direct:serviceFacade").setBody(property(Exchange.GROUPED_EXCHANGE));